【发布时间】:2013-08-16 15:40:49
【问题描述】:
假设我有一个实体 User 和一个实体 Book 并且它们都由 User.bookId = Book.id 加入(这标志着用户拥有某本书,关系类型为 oneUserToManyBook)。
如果我现在想使用 Doctrine 的 DQL 或 QueryBuilder 对所有 Books 和 User 执行性能友好的提取,那么在 Symfony2/Doctrine2 webapp 中实现此功能的最佳方法是什么,以便我可以使用它们在我的User 循环中的 Twig 模板中?
树枝
{% for user in users %}
{{ user.name|e }}
{% for address in user.getAddressesByUserId(user.getId()) %}
{{ address.city }}
{% endfor %}
{% endfor %}
我看到了两种方法,但都没有达到我的目标:
第一种方法
创建自定义存储库类BookRepository:
public function getBooksOwnedByUser($user_id) {
return $em->createQuery('SELECT b.title
FROM MyBundle\Entity\User u,
MyBundle\Entity\Book b
WHERE u.book_id = b.id'
AND u.id = :user_id)
->setParameter('user_id', $user_id)
->getResult();
}
问题:工作正常,但我不能在我的 Twig 模板中调用 getBooksOwnedByUser()(因为它不绑定到实体 User,而是绑定到它的存储库,它是 @987654332 的子类@。
第二种方法
执行与上述相同的查询 - 不是在我的 UserRepository 中,而是直接在我的 User 实体类中。
这里的问题:我可以在我的 Twig 模板中调用此方法,但我不能(也不应该)在我的 User 实体类中使用 EntityManager。
【问题讨论】:
-
第三种方法:从控制器执行此操作并将数据发送到视图?
-
那是不是意味着我必须在渲染之前遍历所有用户?没有更优雅的方法吗?但我喜欢你的方法的一般可行性! +1
-
嗯,是的,但即使你在视图中这样做,你也必须遍历所有用户:)
-
是的,这是真的。我按照您建议的方式实施了它。但是我仍然需要循环输入我的模板,不是吗? :-)
-
是的,您将不得不遍历您的
users,但没关系,视图可以做到这一点。它不应该做的是从数据库中检索信息(因为这是业务逻辑)。
标签: symfony doctrine-orm twig