【问题标题】:PHP PDO fetchAll, PDO::FETCH_CLASS and joinsPHP PDO fetchAll、PDO::FETCH_CLASS 和连接
【发布时间】:2011-12-24 14:10:45
【问题描述】:

以下代码有问题:

$query = 'SELECT user.id as id, pet.name as name FROM user 
          LEFT JOIN pet on pet.user_id = user.id
          WHERE user.id = 15';

$result = $pdo->query($query); 

这段代码会产生类似这样的东西:

***************
| id | name   |
***************
| 1  | Mikey  |
***************
| 1  | Stewie |
***************
| 1  | Jessy  |
***************

现在,我想使用PDO::FETCH_CLASS 来获取一个对象。但是,至少对我而言,这种方法仅适用于简单的 SELECT 语句。当您有一个 join 语句时,它将获取单个类中的所有内容。换句话说:

$user = $result->fetchAll(PDO::FETCH_CLASS, 'User');
echo $user->name; // this will print the pet name (which is weird)

因此,我想要类似的东西:

$pets = $user->pets; // an array holding Pet Objects 
foreach ($pets as $pet)
   echo $pet->name . "-"; 

这将产生:

Mikey - Stewie - Jessy -

我怎样才能做到这一点?

【问题讨论】:

    标签: php oop pdo


    【解决方案1】:

    您不能依赖 PDO 为您完成这项工作。 PDO 无法知道数据集列的来源,它显然无法确定您要转储数据的位置。

    最简单的答案是您必须编写自己的代码。将行作为数组获取并用它填充你的类,因为它一直都是这样做的;-)

    您描述的技术是 ORM (Object-relational mapping)。有一些第三方库实现了它,例如DoctrinePropel

    【讨论】:

      【解决方案2】:

      我开源了一个非常小的函数,可以将连接的结果转换为层次结构。如果您只需要这个小功能,这可以避免使用繁重的 ORM。 https://github.com/afilina/nestedsql

      你会给它一个这样的声明:

      SELECT album.id AS albums__id, photo.id AS albums__photos__id
      FROM album
      LEFT JOIN photo ON photo.album_id = album.id;
      

      它会产生这样的结果:

      stdClass Object
      (
          [albums] => Array
              (
                  [1] => stdClass Object
                      (
                          [id] => 1
                          [photos] => Array
                              (
                                  [1] => stdClass Object
                                      (
                                          [id] => 1
                                      )
                              )
                      )
              )
      )
      

      您可以选择用自己的类替换 stdClass。

      【讨论】:

        猜你喜欢
        • 2013-02-18
        • 2014-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        相关资源
        最近更新 更多