3

仮想フィールドに基づくロジックをDoctrine_Queryに挿入する方法はありますか?

モデルに仮想フィールド「getStatus()」を定義しました。これを最終的にDoctrine_QueryのWhere句で使用します。

...
->AndWhere('x.status = ?',$status);

ただし、「ステータス」はテーブルの列ではなく、モデルのビジネスロジックによって計算されます。

クエリの実行後にコレクションをフィルタリングすることは、状況によっては機能しますが、コレクションにアクセスする前にオフセットなどを計算するため、Doctrine_Pagerがミックスにスローされた場合は機能しません。

Doctrine_Pagerを捨てて、Doctrine_Collectionを変更した後にその機能を再構築するのが最善ですか?

4

2 に答える 2

0

SQLでできるなら、Doctrineでもできます。ドクトリンが行っているのは、文字列であろうと値であろうと、DQLパーサーに入力しているものを処理し、それをSQLに変換し、結果からオブジェクトをハイドレートすることです。

Doctrine_Pager を使用してクエリ以外のオブジェクトをページングすることはできませんが、sfPager を使用して Doctrine_Collection の結果を配列として渡すことはできますか? 最悪の場合、クエリの結果からクエリの制限を差し引いたものを渡して、ページングを処理させることもできますが、これは実際には非効率的です。

通常の古い PHP で行うように、ページャー "old skool" を作成する方が速い場合があります。

于 2010-05-24T06:53:14.257 に答える
0

ステータスを計算するためにどのようなビジネス ロジックを適用しているのかはよくわかりませんが、それがライブでない場合 (リクエストごとに計算される場合など)、保存時に計算します (Doctrine Record Listener または単に preSave を使用)。 /preInsert フックをモデルに挿入) してテーブルに保存するか、symfony タスクを設定して定期的に更新し、それを cronjob として実行します。これにより、Doctrine で問題なくクエリを実行でき、付加的なメリットとしてパフォーマンスが向上します。

または、ステータスが関連オブジェクトの状態に依存している場合は、変更されたときに親オブジェクトのステータスを更新するイベント トリガーをオブジェクトに配置できます。より多くのコンテキストがなければ、最善のアプローチを推奨することは困難です。:)

于 2010-05-27T17:00:32.427 に答える