【问题标题】:loading a PHP class object from a database--best practices, database handle, etc从数据库加载 PHP 类对象——最佳实践、数据库句柄等
【发布时间】:2013-06-29 13:37:48
【问题描述】:

我想也许我的问题已经在 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 编码的数组或其他东西)。

【问题讨论】:

标签: php class pdo


【解决方案1】:

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

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

这可能最好在programmers.stackexchange上问,因为它是一个非常开放的问题,我想有很多不同的方法可以做到这一点,并且对这个问题有很多看法。

【讨论】:

  • 感谢您的回复。你可能是对的——我可能在错误的地方问了这个问题,因为我的方法有效,但我不确定这是一个好习惯。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。非常有趣,绝对是我需要阅读的东西。不过,我不得不编辑我的问题,因为我认为我过于简化了示例,并且可能没有完全解释我的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2014-08-01
  • 2021-06-16
相关资源
最近更新 更多