2013-08-14 2 views
0

...Doctrine 2 proxy loading and array result

Hi! с Doctrine 2.3, я пытаюсь получить в качестве массива список пользователей и их групп (для изменения :)).

Так я определил класс пользователей, как это:

/** 
* @Entity 
**/ 
class User { 
    /** 
    * @ManyToMany(targetEntity="Group") 
    * @var Group[] 
    **/ 
    protected $groups; 

    ... 
} 

А класс группы:

/** 
* @Entity 
**/ 
class Goup { 
    /** 
    * @ManyToMany(targetEntity="User) 
    * @var User[] 
    **/ 
    protected $users; 

    ... 
} 

Тогда я 10'000 пользователей и 100 групп, и каждый пользователь может иметь несколько групп. Я хотел бы получить, только для чтения, первых 200 пользователей с их группами.

Как достичь этого, используя гидратацию массива? Является ли это возможным?

Я попробовал:

$query = new \Doctrine\ORM\QueryBuilder($em); 
$query 
    ->select('u, g') 
    ->from('User', 'u') 
    ->leftJoin('Group', 'g') 
    ->setFirstResult(0) 
    ->setMaxResults(200) 
    ->getQuery() 
    ->getArrayResult(); 

Но я не получаю 200 пользователей. Из-за соединения я получаю, скажем, 40 или 50 пользователей (что нормально, так как в листе 200 принимают группы). Я знаю, что с ленивой (или нетерпеливой?) Загрузкой и прокси-серверами я могу отложить загрузку для групп, но здесь у меня есть массив, поэтому я не могу назвать какой-либо метод.

Есть ли аннотация для добавления где-нибудь или что-то для настройки QueryBuilder или запроса?

Большое спасибо!

ответ

0

Ваша проблема описана в желтой ноте поле здесь: http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#first-and-max-result-items-dql-query-only

Это возможно при использовании Doctrine Paginator вместо getArrayResult(). Вы можете прочитать, как использовать Paginator здесь: http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

Это связанный с этим вопрос: Limiting a doctrine query with a fetch-joined collection?

+0

Ok, так что нет никакой «магии» способом ограничения ResultSet. Как тип гидратации, который должен сказать «предел от, затем выберите все с этими идентификаторами, а затем гидратируйте массив». Я попробую с paginator, спасибо! – rekam