如何将Doctrine2实体图转换为数组

时间:2012-03-03 23:58:12

标签: orm doctrine-orm

我有以下实体

我想要做的是当我通过id获取Product时,我想将其转换为包括所有相关实体(包括其相关条目)的数组。

结果数组需要可序列化。

2 个答案:

答案 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);

另外,我认为你应该避免以大写字母开头的班级成员。它可能会对实体名称造成一些混淆。