从数据库加载PHP类对象——最佳实践、数据库句柄等


loading a PHP class object from a database--best practices, database handle, etc

我想我的问题可能在stackoverflow上的其他地方得到了部分答案,但我觉得我可以通过一起提问得到更全面的答案。我为我可能键入的任何愚蠢的东西道歉——我在PHP方面做得还不够,所以当我这样做的时候,我觉得我在重新学习。

总之,假设我有一个名为"items"的mysql数据库表,其中包含以下列:item_iditem_typeitem_name。我有一个PHP类,看起来像这样:

class Item
{
    public $item_id;
    public $item_type;
    public $item_name;
}

换句话说,我真的只是想要一个从数据库到类对象的直接映射。

我决定在类中包含一个名为"load"的方法,该方法在提供item_id时检索项数据。下面是我的两个问题:

  1. 连接到类中数据库的最佳方式是什么?我应该在类中实例化一个新的PDO对象,还是应该将PDO数据库句柄作为加载方法的参数传入?这有关系吗
  2. 作为分配类属性的一种方式,这有意义吗?或者有更聪明的方法:

    $sth = $dbh->query("SELECT * FROM items WHERE item_id = $item_id");
    $sth->setFetchMode(PDO::FETCH_CLASS, 'Item');
    while ($obj = $sth->fetch()) {
        foreach ($obj as $key => $value) {
            $this->$key = $value;
        }
    }   
    

编辑:在看到这些回复后(可以肯定的是,这些回复很有趣),我意识到我可能没有深入到足够的细节。

我认为使用ORM库对我正在做的事情来说可能有些过头了(只是一个个人爱好项目,而不是雇主的项目),但实际上,无论如何,我不确定这是否是我所需要的。原因如下。因为我可能有这样的东西:

class InventoryItem extends Item
{
    public $user_id;
    public $quantity;
}

我还没有真正想清楚。只是举个例子。所以我用来获取数据的查询可能看起来像这样:

SELECT * 
FROM items, inventories 
WHERE item.item_id = inventories.item_id 
AND user_id = $user_id;

换句话说,我必须创建一个SQL语句,它将正确地提取类的数据,我只需要知道我是应该传入数据库句柄还是在load方法中创建它,以及上面的代码作为分配属性值的好方法是否有意义。

另外一个问题是,我可能必须处理一些数据(例如,如果其中一列存储了json编码的数组或其他什么)。

我使用一个通用的数据库对象类,然后我有单独的类(与数据库中的不同表匹配),每个类都扩展了它。

数据库对象类包含将行实例化为对象并执行任何crud的函数,扩展这些行的类只包含每个表对象的属性。

这个问题最好在程序员的博客上讨论,因为这是一个开放式的问题,我想有很多不同的方法可以做到这一点,也有很多关于这个问题的意见。

您正在寻找一个对象关系映射器(orm)。这是一个库,用于定义映射到数据库表的对象。

Doctrine似乎是PHP的首选ORM。还有其他人。