У меня есть некоторые пользовательские документы, которые ссылаются на многие предметы.
Пользователь:
class User
{
//...
/**
* @ODM\ReferenceMany(targetDocument="Item", mappedBy="user", cascade={"remove"})
*/
protected $items;
//...
Вещь:
class Item
{
/**
* @ODM\ReferenceOne(targetDocument="User", inversedBy="items")
*/
protected $user;
Я хочу отобразить список всех пользователей с количеством элементов. Итак, у меня есть один запрос:
$users = $dm->getRepository('Acme:User')->findAll();
И я использую count
метод в поле «элементы»
{% for user in users %}
// ...
{{ document.items.count }} items
// ...
{% endfor %}
Проблема в том, что Doctrine создает новый запрос для каждого пользователя, и это приводит к ограничениям памяти и тайм-аутам.
Есть ли способ сообщить доктрине о загрузке всех элементов, когда она выполняет запрос findAll? Я хотел бы, чтобы это делалось только при необходимости (не в определении сущности, а на уровне запроса).
По умолчанию доктрина выполняет ленивую загрузку, например он не извлекает данные, пока не будет запрошен. Если вы хотите обойти ленивую загрузку, вам нужно получить соединение вместо обычного соединения.
http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#joins
Это требует от вас написать собственный запрос, так как «findAll ()» не будет вашим другом.
Других решений пока нет …