在Doctrine 2 ORM中如何在不发出新查询的情况下使用已存储在我的存储库中的实体?

时间:2011-06-20 10:18:44

标签: php orm symfony1 doctrine doctrine-orm

鉴于我预先获取所有实体

// 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查询来填充repo?

1 个答案:

答案 0 :(得分:2)

Doctrine中的存储库是对象存储的外观,实际上它只是一个用于访问数据库的抽象层。它不会“保留”从查询返回的任何对象。

Doctrine跟踪已在UnitOfWork中加载的对象,但它保留的唯一索引是标识符。因此,如果您对已经加载的对象使用find()函数,它将不会命中数据库,但任何其他查询都将。

虽然没有内置的方法可以满足您的要求,但Doctrine确实允许您创建自定义存储库类,您可以在其中自行实现。但要小心,因为您可能会发现PHP中的某些查找比执行SQL查询要慢。