2011-11-08 91 views
3

我有下面的代码有问题:PHP PDO使用fetchall,PDO :: FETCH_CLASS并加入

$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声明。当你有一个连接语句时,它会在一个类中获取所有内容。换句话说:

$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 - 

我怎样才能做到这一点?

回答

6

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

最简单的答案是你必须编写自己的代码。将行作为数组提取并填充类,因为它总是完成;-)

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

0

我打开一个非常小的函数,它会将连接的结果转换为层次结构。这样可以避免使用繁重的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的。