我为我拥有的每个数据库表都有一个类,例如,events
表的行存储在Event
类中。对于我编写的每个类,都有几种完全相同的方法,只是使用了不同的变量或列名。例如:
玩家等级update()
public function update() {
$conn = new PDO( db_host, db_user, db_pw );
$sql = "UPDATE players SET name=:name, picture=:picture, position=:position, num=:num, team=:team, description=:description WHERE id = :id";
$st = $conn->prepare ( $sql );
$st->bindValue( ":name", $this->name, PDO::PARAM_STR );
$st->bindValue( ":picture", $this->picture, PDO::PARAM_STR );
$st->bindValue( ":position", $this->position, PDO::PARAM_STR );
$st->bindValue( ":num", $this->num, PDO::PARAM_INT );
$st->bindValue( ":team", $this->team, PDO::PARAM_INT );
$st->bindValue( ":description", $this->description, PDO::PARAM_STR);
$st->bindValue( ":id", $this->id, PDO::PARAM_INT );
$st->execute();
$conn = null;
}
团队等级update()
public function update() {
$conn = new PDO( db_host, db_user, db_pw );
$sql = "UPDATE teams SET name=:name, sname=:sname, logo=:logo, sport=:sport WHERE id = :id";
$st = $conn->prepare ( $sql );
$st->bindValue( ":name", $this->name, PDO::PARAM_STR );
$st->bindValue( ":sname", $this->sname, PDO::PARAM_STR );
$st->bindValue( ":logo", $this->logo, PDO::PARAM_STR );
$st->bindValue( ":sport", $this->sport, PDO::PARAM_STR );
$st->bindValue( ":id", $this->id, PDO::PARAM_INT );
$st->execute();
$conn = null;
}
您可以看到方法的要点是相同的,只是绑定到该语句的变量不同(更多方法就是这种情况)。有没有一种简单的方法可以使每个类具有相同的基本update()
,insert()
,delete()
...方法,但具有各自的变量?我曾考虑过从超类继承基本行为,但从面向对象的角度来看并没有多大意义(而且我不相信有任何方式可以说“对于在该类中声明的每个公共变量”)确定是否有一种使用合成的方法(或者说真的)。
是的,这是您正在谈论的婴儿ORM,很容易实现。
首先,创建一个具有所有常用方法(create(),update(),find()等的原型类)。
abstract class BaseDataMapper
{
protected $_db;
protected $_table;
protected $_primary = 'id';
protected $_fields = [];
public function __construct($db)
{
$this->_db = $db;
}
public function find($id)
{
$sql = "SELECT * FROM `$this->_table` WHERE `$this->_primary` = ?";
$stmt = $this->_db->prepare($sql);
$stmt->execute([$id]);
$stmt->setFetchMode(PDO::FETCH_INTO, $this);
$stmt->fetch();
}
public function update()
{
$data = [];
$set = "";
foreach($this->_fields as $key)
{
$set .= "`$key` = :$key,";
$data[$key] = $this->{$key};
}
$set = rtrim($set, ",");
$data[$this->_primary] = $this->{$this->_primary};
$where = "$this->_primary = :$this->_primary";
$sql = "UPDATE {$this->_table} SET $set WHERE $where";
$this->_db->prepare($sql)->execute($data);
}
}
然后创建实际的类,扩展您的原型类,例如Team
class Team extends BaseDataMapper
{
protected $_table = "teams";
protected $_fields = ['name', 'sname', 'logo', 'sport'];
}
在这里,您必须定义表和字段名称,以使我们的自动化工作。现在!您要做的就是简单地调用update()
方法!
include 'pdo.php';
$team = new Team($pdo);
$team->find(1)
$user->name = "Boston Celtics";
$user->sname = "Celtics";
$user->update();
注意,永远不要在每个方法内部创建新的数据库连接。创建一次,然后传递给您的类的构造函数。这是how to connect with PDO properly。