我想知道如何在类中使用数据库。例如,如何编写查询以便于将来编辑和按OOP规则。
第一个例子:
class User {
public function select($query) {
//work with data
return $data;
}
public function insert($query) {
//work with data
}
}
在此示例中,user(me)为每个方法添加查询。对我来说,最大的缺点是我必须记住我的查询的正确形式。这个例子很容易理解,但是如果我将处理更复杂的查询,很难编写正确的查询形式。
下一个例子:
class User {
const select = "SELECT * FROM user WHERE ID = ?";
const insert = "INSERT INTO user VALUES (?)";
public function select($id) {
//work with data
return $data;
}
public function insert($id) {
//work with data
}
}
我将每个查询定义为常量。这种形式的类非常方便,但另一方面,如果我想获得用户的ID我不能,因为我会知道数据库中ID字段的名称。我在第三个例子中解决了这个问题
第三个例子:
class User {
private $table, $idField;
public function setDatabaseInformation($table, $idField) {
$this->table = $table;
$this->idField = $idField;
}
public function select($id) {
//work with data
//query as SELECT * FROM $this->table WHERE $this->idField = ?
return $data;
}
public function insert($id) {
//query as INSERT INTO $this->table VALUES (?)";
//work with data
}
}
Personaly我认为,这个例子是最好的,因为我拥有我想要的一切,我无法记住查询形式。另一方面,这个例子有点长,非常普遍,我不知道OOP规则是否正确。
我的问题是:如何在数据库中编写查询还有其他选择吗?最后一个例子是否符合OOP规则?你用哪种方式?
感谢您的建议。
答案 0 :(得分:1)
抽象课堂内的全部内容!你想编写最终看起来像这样的代码:
$database = new PDO(...); // or whatever
$userStorage = new UserStorage($database);
$user = $userStorage->getById(42);
$users = $userStorage->getByName('Joe');
class UserStorage {
protected $db;
public function __construct(PDO $db) {
$this->db = $db;
}
public function getById($id) {
$stmt = $this->db->prepare('SELECT ... WHERE id = ?');
$stmt->execute([$id]);
...
return $user;
}
...
}
您只想在一个特定的权威位置编写一次逻辑查询。对于每个可能的逻辑"动作",创建一个方法(一种通过id获取用户的方法,一种通过名称获取它们的方法等)。每个方法在内部都可以根据需要复杂或简单,但是您可以在其中编写特定查询以获取特定数据。最后:依赖注入您的数据库连接。