5

我的项目中有一个设计问题,与一些业务逻辑的放置位置有关。

我有三个实体,Event、TicketOrder 和 Ticket。一个 Event 有很多 TicketOrder,而一个 TicketOrder 有很多门票。

在我的模板中,我必须显示一个 Event 有多少张门票。我一直在考虑实现这一目标的最佳方法,但没有得到好的解决方案。我试过这个:

1) 在 Event 实体中创建一个私有成员 'ticketsCount',使用 setTicketsCount 和 getTicketsCount 方法。使用 LifeCycleCallback 'PostLoad' 创建一个 'loadTicketsCount' 方法,以访问 TicketRepository 方法 'findByEvent'。这是不可能的,因为我无法访问实体类中的存储库。

2) 在将用于显示事件的操作中,我可以访问 Ticket Repository 并手动设置事件“ticketsCount”属性。我不知道这是否是一个好方法,因为如果我的操作列出了很多事件,我将不得不遍历所有事件并对每个事件进行存储库调用。

我真的不知道实现这一目标的最佳方法,如果有人可以帮助我,我将不胜感激。

谢谢!;)

4

1 回答 1

2

当您使用学说实体存储库的 findAll、findBy 或 findBy* 方法时,会返回一个包含实体对象的简单 php 数组。

数组类实现了可数接口。所以使用树枝长度过滤器

{{ ticketOrder.tickets|length }}

count()你在数组上执行一个简单的 php 。

实际上现在执行计数查询是有意义的,因为您已经在内存中获得了结果。因此,对结果进行计数并从内存中检索它似乎更有效,因为当您访问关联时,它们会完全加载到内存中。


然而,实体之间的关联可能会变得非常大。因此,想象一下您与数十万个实体有关联。您不会将这些实体一起加载并一直保存在内存中。因此,在 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,例如填充数据的模板。

于 2013-02-26T23:43:58.240 回答