我有以下实体
我想要做的是当我通过id获取Product时,我想将其转换为包括所有相关实体(包括其相关条目)的数组。
结果数组需要可序列化。
答案 0 :(得分:6)
使用doctrine查询构建器和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);
}
}
答案 1 :(得分:0)
我认为您需要在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);
另外,我认为你应该避免以大写字母开头的班级成员。它可能会对实体名称造成一些混淆。