5

ビジネスロジックを配置する場所に関連して、プロジェクトで設計上の問題が発生しています。

Event、TicketOrder、Ticket という 3 つのエンティティがあります。1 つのイベントには多数の TicketOrder があり、1 つの TicketOrder には多数のチケットがあります。

私のテンプレートでは、イベントのチケット数を表示する必要があります。これを達成するための最善のアプローチを考えましたが、良い解決策が得られませんでした。私はこれを試しました:

1) setTicketsCount および getTicketsCount メソッドを使用して、Event エンティティにプライベート メンバー 'ticketsCount' を作成します。LifeCycleCallback 'PostLoad' を使用して 'loadTicketsCount' メソッドを作成し、TicketRepository メソッド 'findByEvent' にアクセスします。エンティティ クラスのリポジトリにアクセスできないため、これは不可能でした。

2) イベントの表示に使用されるアクションで、チケット リポジトリにアクセスし、イベントの「ticketsCount」プロパティを手動で設定できます。アクションが多くのイベントをリストしている場合、すべてのイベントをループして、それぞれにリポジトリ呼び出しを行う必要があるため、これが良いアプローチであるかどうかはわかりません。

これを達成するための最善のアプローチが本当にわからないので、誰かが私を助けてくれれば本当に感謝しています。

ありがとう!;)

4

1 に答える 1

2

doctrineエンティティリポジトリのfindAll、findBy、またはfindBy *メソッドを使用すると、エンティティオブジェクトを含む単純なphp配列が返されます。

配列クラスは、可算インターフェースを実装します。したがって、小枝長フィルターを使用します

{{ ticketOrder.tickets|length }}

count()配列に対して単純なphpを実行します。

すでに結果がメモリにあるため、実際にはカウントクエリを実行するのが理にかなっています。したがって、アソシエーションにアクセスすると、結果が完全にメモリにロードされるため、結果をカウントしてメモリから取得する方が効率的です。


ただし、エンティティ間の関連付けはかなり大きくなる可能性があります。したがって、数十万のエンティティとの関連付けがあると想像してください。それらの誘惑がすべて一緒にロードされ、常にメモリに保持されることはありません。したがって、Doctrine 2.1では、関連付けにExtraLazyとして注釈を付けることができます。その場合、上記の小枝フィルターを呼び出すときにカウントクエリが実行されます。ただし、結果はメモリに保持されません。

http://docs.doctrine-project.org/en/2.0.x/tutorials/extra-lazy-associations.html


あなたの最新のコメントによると:

これを行う1つの方法を想像できます。テンプレートでは、次のようなレンダリングステートメントを使用してコントローラーのアクションを呼び出すことができます。

{% render YourMainBundle:getTickets with { 'event_id' : event.id } %}

このアクションでは、特定のイベントに関連付けられているすべてのチケットを検索するクエリを呼び出すことができます。このアクションは、データで満たされたテンプレートなどのhtmlを返す必要があります。

于 2013-02-26T23:43:58.240 に答える