我的项目中存在设计问题,与放置某些业务逻辑的地方有关。
我有三个实体,Event,TicketOrder和Ticket。 One Event有很多TicketOrders,一个TicketOrder有很多Tickets。
在我的模板中,我必须显示一个事件有多少票。我想到了实现这一目标的最佳方法,并没有得到一个好的解决方案。我试过这个:
1)使用setTicketsCount和getTicketsCount方法在Event实体中创建私有成员'ticketsCount'。使用LifeCycleCallback'PostLoad'创建'loadTicketsCount'方法,以访问TicketRepository方法'findByEvent'。这是不可能的,因为我无法访问实体类中的存储库。
2)在用于显示事件的操作中,我可以访问Ticket Repository并手动设置事件'ticketsCount'属性。我不知道这是否是一个好方法,因为如果我的行为列出了很多事件,我将不得不循环所有事件并对每个事件进行存储库调用。
我真的不知道实现这一目标的最佳方法,如果有人可以帮助我,我将非常感激。
谢谢! ;)
答案 0 :(得分:2)
当你使用findAll,findBy或findBy * doctrine实体库的方法时,会返回一个包含实体对象的简单php数组。
数组类实现可数接口。所以使用树枝长度过滤器
{{ ticketOrder.tickets|length }}
你在阵列上执行一个简单的php count()
。
实际上现在有意义执行计数查询,因为你已经在内存中得到了结果。因此,计算结果并从内存中检索它似乎更有效,因为当您访问关联时,它们会完全加载到内存中。
然而,实体之间的关联可能会变得非常大。因此,假设您与数十万个实体有关联。你不会把这些所有的东西都装在一起并且一直保存在记忆中。因此,在Doctrine 2.1中,您可以将关联注释为 Extra Lazy 。如果您这样做,则在调用上述树枝过滤器时会执行计数查询。但结果并没有留在记忆中。
http://docs.doctrine-project.org/en/2.0.x/tutorials/extra-lazy-associations.html
根据您的最新评论:
我可以想象一种方法。在模板中,您可以使用render语句调用控制器的操作,如
{% render YourMainBundle:getTickets with { 'event_id' : event.id } %}
并且在此操作中,您可以调用查找与特定事件关联的所有故障单的查询。此操作必须返回html,例如一个充满数据的模板。