В Doctrine 2 ORM Как использовать сущность, которая уже находится в моем хранилище, без выдачи нового запроса? - PullRequest
0 голосов
/ 20 июня 2011

Учитывая, что я забираю все свои сущности заранее

// Get All Users
$qb = $em->createQueryBuilder();
$qb->select("u")->from->("User u");
$q = $qb->getQuery();
// Doesn't this store any entities returned in the repository?
$r = $q->getResult();

Если бы я затем опросил свой репозиторий, я бы ожидал, что ему не придется возвращаться в базу данных для решения моего запроса - но это так. Почему это?

// Get a particular user
$user = $em->getRepository('\User')->findByName('JoeBloggs');

// Is generating another query same as above but with 'where' clause...

Можно ли каким-то образом использовать один запрос DQL для заполнения своего репо, а затем продолжать опрашивать репо для сущностей, не обращаясь к БД каждый раз?

Кроме того, есть ли способ изначально заполнить репо, используя более одного запроса DQL?

1 Ответ

2 голосов
/ 21 июня 2011

Репозитории в Doctrine - это фасад для хранения объектов, тогда как на самом деле это просто уровень абстракции для доступа к базе данных.Он не «удерживает» ни один из объектов, возвращаемых запросами.

Doctrine отслеживает объекты, которые были загружены в UnitOfWork, но единственный индекс, который он сохраняет, находится по идентификатору.Поэтому, если вы используете функцию find () для объекта, который уже загружен, он не попадет в базу данных, но любой другой запрос будет.

Хотя встроенного способа сделать то, что вы есть, нет.спрашивая, Doctrine позволяет вам создавать собственные классы репозитория, в которых вы можете реализовать это самостоятельно.Будьте осторожны, так как вы можете обнаружить, что некоторые из этих поисков в PHP будут медленнее, чем выполнение SQL-запроса.

...