我在以下代码中遇到问题:
$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 -
我怎样才能做到这一点?
答案 0 :(得分:6)
您不能依靠PDO为您完成这项工作。 PDO无法知道数据集列的来源,显然无法确定要转储数据的位置。
最简单的答案是你必须编写自己的代码。将行作为数组获取并使用它来填充类,因为它始终已完成; - )
您描述的技术是ORM(Object-relational mapping)。有一些第三方库可以实现它,例如Doctrine或Propel。
答案 1 :(得分: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。