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

时间:2013-07-02 08:53:30

标签: php class pdo

我想也许我的问题已经部分地在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数据库句柄作为参数传递给load方法?这有关系吗?
  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;
        }
    }   
    
  3. 修改 我在看到这些回复(确实有趣的阅读)后意识到,我可能没有详细介绍。

    我认为使用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编码的数组或其他内容)。

2 个答案:

答案 0 :(得分:1)

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

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

对于programmers.stackexchange,这可能是更好的问题,因为它是一个非常开放的问题,我想有很多不同的方法可以做到这一点和对此事的看法。

答案 1 :(得分:0)

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

Doctrine似乎是PHP的首选ORM。还有others