1

まず第一に、Doctrine 開発者の皆さんに心から感謝したいと思います。私の問題は次のとおりです。

私は3つのテーブルを持っています:

person (id, name, isActive)
email (id, address, isActive)
personEmailRel(id, personId, emaiId, isActive)

そして、私は個人ごとにメールのリストを取得したい:

/**
 * Unidirectional - Many persons have many emails
 *
 * @ManyToMany(targetEntity="Address_Model_Email")
 * @JoinTable(name="personEmailRel",
 *   joinColumns={@JoinColumn(name="personId", referencedColumnName="id")},
 *   inverseJoinColumns={@JoinColumn(name="emailId", referencedColumnName="id")}
 * )
 */
private $_emails;

public function __construct()
{
    $this->_emails = new Collections\ArrayCollection();
}

public function getEmails()
{
    return $this->_emails;
}

正常に動作します。しかし、問題は、結合句 isActive=1 で追加条件も設定したいということです。Doctrine2でそれを解決する方法は? ありがとう。

4

2 に答える 2

0

ManyToMany では作業しませんが、3 番目のエンティティ PersonEmail を作成します。

ただし、あなたのデータベーススキーマは非常に疑わしいと思います。電子メールにはなぜ多くの人を含めることができるのですか? この場合、OneToMany 関係で十分ではないでしょうか? 結合テーブルの利点がわかりません。

于 2010-11-25T11:17:14.230 に答える
0

Doctrine は関連付けの条件をサポートしていませんが、これを解決するにはいくつかの方法があります:

必要な関連エンティティを照会するリポジトリ メソッドを作成します。QueryおよびQueryBuilderを参照してください。

Collection Criteria APIを使用して、非アクティブなエンティティを getter (エンティティ内) のコレクションからフィルタリングします。関連付けが「EXTRA_LAZY」としてマークされている場合、コレクション全体を取得する代わりに、最適化されたクエリが使用されます。これは、大規模なコレクションに非常に役立ちます。

Filter APIを使用して、非アクティブなエンティティを DB レベルでフィルタリングします。これは、非アクティブな (または削除されたなどの) エンティティをほとんど常に非表示にしたい場合に非常に便利です。

于 2013-09-01T14:20:26.157 に答える