0

一連の販売メモと取引記録の間に多対 1 の関係を設定しようとしています。

/**
 * @var TransactionInterface
 *
 * @ORM\ManyToOne(targetEntity="Twb\Common\Model\Broker\TransactionInterface")
 * @ORM\JoinColumn(name="FormNoSeller", referencedColumnName="Form")
 */
private $formnoseller;

/**
 * @var TransactionInterface
 *
 * @ORM\ManyToOne(targetEntity="Twb\Common\Model\Broker\TransactionInterface")
 * @ORM\JoinColumn(name="FormNoBuyer", referencedColumnName="Form")
 */
private $formnobuyer;

現時点では、これらは 2 つの異なるバンドル (「SalesBundle」と「BrokerBundle」) に分割されています。それを念頭に置いて、SalesBundle の SalesMemo エンティティから BrokerBundle の Transaction エンティティへのインターフェイスを使用しています。

何らかの理由で、フォームで$formnosellerとのいずれかまたは両方を参照すると、dev.log で、SalesMemos のand/orフィールドに$formnobuyer一致するすべてのトランザクション行を選択した後、Doctrineがトランザクション テーブルのすべての行 ( TransactionInterface が参照するエンティティ)。DB には無数の行があり、多くのメモリを消費するため、これは少し問題です。$formnoseller$formnobuyerSELECT

関連のあるすべての行をDoctrineが選択しないようにする方法はありますか? それとも、Doctrine が関連付けを行う方法を正しく理解していますか? 助けてくれてありがとう。

4

2 に答える 2

1

あなたの問題についての私の理解は、エンティティ フィールド タイプを$formnosellerandに使用している$formnobuyer(またはタイプを指定していない) ことです。基になるテーブルから任意の要素を選択する選択肢を与えることは、エンティティ フィールド タイプ (OneToMany リレーションシップで既定で使用される) の予想される動作です。

これらのフィールドに対してテーブルのすべての要素の選択リストが必要ない場合は、他のフォーム フィールド タイプを使用する必要があります。ドキュメントのデータ トランスフォーマーも参照してください。

于 2013-09-17T07:00:59.920 に答える
0

私だったら、ストアド プロシージャを作成し、必要に応じて内部結合または外部結合を実行します。

むかしむかし、彼らはこれを「クライアント サーバー」コードと呼んでいました。約 15 年前、業界全体が n 層開発に移行したことで、このような混乱が生じました。テーブル結合がどのようにしてプレゼンテーション層に戻されたのか知りたいですか? ORM と LINQ-to-SQL は、クライアント/サーバーへの回帰です。」

この方法で行う必要がある場合は、モデルで LINQ に参加します。ORM 言語では行わないでください。

于 2013-09-16T21:05:43.177 に答える