Как преобразовать граф сущности Doctrine2 в массив - PullRequest
3 голосов
/ 04 марта 2012

У меня есть следующие объекты

Что я пытаюсь сделать, так это когда я получаю Продукт по идентификатору, я хочу преобразовать его в массив, включающий все связанные объекты, включая связанные с ними записи.

Массив результатов должен быть сериализуемым.

Ответы [ 2 ]

6 голосов
/ 04 марта 2012

Использовать конструктор запросов doctrine и режим гидратации HYDRATE_ARRAY?

Редактировать: Извините, что не включил примеры, я был на моем мобильном телефоне в то время. Прочтите сообщение в блоге Я написал о некоторых хороших практиках с доктриной, которые частично связаны с этим.

Для примера кода метод репозитория, который я написал бы для покрытия этого, был бы следующим (я бы избегал использования таких сокращений, как 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);
    }
}
0 голосов
/ 04 марта 2012

Я думаю, вам нужно использовать JOIN в синтаксисе DQL:

$results = $entityManager->executeQuery('SELECT p FROM Product p JOIN p.Brand b JOIN p.Tags t JOIN p.Categories c')->getArrayResult();
var_dump($results);

Кроме того, я думаю, вам следует избегать учеников, начинающихся с заглавной буквы. Это может привести к путанице с именем сущности.

...