【发布时间】:2012-03-04 22:21:01
【问题描述】:
我有以下实体
我想要做的是当我通过 id 获取产品时,我想将其转换为数组,包括所有关联实体,包括它们的关联条目。
结果数组需要可序列化。
【问题讨论】:
标签: orm doctrine-orm
我有以下实体
我想要做的是当我通过 id 获取产品时,我想将其转换为数组,包括所有关联实体,包括它们的关联条目。
结果数组需要可序列化。
【问题讨论】:
标签: orm doctrine-orm
使用理论查询生成器和 HYDRATE_ARRAY 水合模式?
编辑:抱歉没有包括示例,我当时正在使用手机。查看the blog post 我写了一些与此半相关的学说的良好实践。
对于代码示例,我要编写的存储库方法如下所示(我会避免使用 p c 等缩写,因为它会使您的代码可读性降低很多(至少在您教义入门...)
<?php
namespace Vendor\Prefix\Repository;
use Doctrine\ORM\EntityRepository;
class ProductRepository extends EntityRepository
{
public function find($id)
{
// $em is the entity manager
$qb = $em->createQueryBuilder();
$qb
->select('product', 'category', 'tag', 'brand', 'category_child')
// Or SomeBundle:Product if you're on symfony
->from('Vendor\Prefix\Entity\Product', 'product')
// You need to explicitly fetch join all your
// associations...and select them
->leftJoin('product.Brand', 'brand')
->leftJoin('product.Tags', 'tag')
->leftJoin('product.Categories', 'category')
->leftJoin('category.Children', 'category_child')
// Use prepared statments...its a good habit
->where($qb->expr()->eq('product.ID', ':id'))
->setParameter('id', $id)
;
$query = $qb->getQuery();
// Potential Hydration Modes
// --------------------------------
// Doctrine\ORM\Query::HYDRATE_OBJECT
// Doctrine\ORM\Query::HYDRATE_ARRAY
// Doctrine\ORM\Query::HYDRATE_SCALAR
// Doctrine\ORM\Query::HYDRATE_SINGLE_SCALAR
// Doctrine\ORM\Query::HYDRATE_SIMPLEOBJECT
// Hydrate the result as an array to get the requested format
// When you use array hyrdation doctrine does it according
// to your entity graph
return $query->getResult(Doctrine\ORM\Query::HYDRATE_ARRAY);
}
}
【讨论】:
我认为你需要在 DQL 语法中使用 JOIN:
$results = $entityManager->executeQuery('SELECT p FROM Product p JOIN p.Brand b JOIN p.Tags t JOIN p.Categories c')->getArrayResult();
var_dump($results);
另外,我认为您应该避免班级成员以大写字母开头。它可能会与实体名称产生一些混淆。
【讨论】:
LEFT JOIN c.Children cc,结果返回空数组