ステートメント
多対多の双方向関係を処理するための自動 Doctrine メカニズムを再現しようとしていますが、カスタム結合テーブルを導入しています。
私はすでに同様の質問を掘り下げました:
- Joining-Table with Metadata Impairs Getters/Setters - Doctrine 2 しかし、それは完全に一方向であるため、実際には役に立ちません
- doctrine2 多対多の中間的な詳細を自己参照しています が、これは関係の管理についても話していません
- Doctrine2: 参照テーブルに余分な列がある多対多を処理する最良の方法 は非常に興味深いものです。ただし、著者は双方向の必要性について言及していますが、そのケースについては触れていません。
追加のフィールドを持つ結合テーブルは関連付けではなく、他の 2 つのエンティティを参照する 3 番目のエンティティに過ぎないことを認識しています。そして、そのステートメントから、Doctrine によって管理される暗黙的な多対多の関連付けとしてすぐに使用できると期待できないことは明らかです。
しかし、このトリオをシンプルでストレートな双方向の多対多の関連付けとして機能させたいので、プロキシ メソッドを使用し、Logic クラスに依存する必要があります。
コード
Category エンティティと Product エンティティがあります。
/**
* @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="CategoryRepository")
*/
class Category
{
/**
...
*/
protected $id = null;
/**
* @ORM\OneToMany(targetEntity="CategoryProduct", mappedBy="category", fetch="LAZY", cascade={"persist"})
*/
protected $categoryProducts;
}
と
/**
* @ORM\Table(name="product")
* @ORM\Entity(repositoryClass="ProductRepository")
*/
class Product
{
/**
...
*/
protected $id = null;
/**
* @ORM\OneToMany(targetEntity="CategoryProduct", mappedBy="product", fetch="LAZY", cascade={"persist"})
*/
protected $categoryProducts;
}
そしてもちろん結合エンティティ:
/**
* @ORM\Table(name="category_product")
* @ORM\Entity(repositoryClass="CategoryProductRepository")
*/
class CategoryProduct
{
/**
...
*/
protected $id = null;
/**
* @ORM\ManyToOne(targetEntity="Category", fetch="EAGER", inversedBy="categoryProducts")
* @ORM\JoinColumn(onDelete="CASCADE")
*/
protected $category;
/**
* @ORM\ManyToOne(targetEntity="Product", fetch="EAGER", inversedBy="categoryProducts")
* @ORM\JoinColumn(onDelete="CASCADE")
*/
protected $product;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
protected $starred = false;
}
問題
純粋な ORM スタイルの方法で、CategoryProduct エンティティの最新のリストを両方のエンティティで利用できるようにするにはどうすればよいですか? ORM では、すべてがオブジェクト層で管理されます。DB への変更はユーザーの要求に応じてのみ行われますが、ORM の観点からのみ機能する限り、強制ではありません。言い換えると:
$category->addProduct($product);
DB には何も書き込まず、オブジェクトをエンティティ マネージャーに永続化することさえしませんが、スクリプトが実行されている限り、リストからこの製品を取得または削除できます。
カスタム結合テーブルの場合は異なります。製品を追加する場合、CategoryProduct エンティティを作成して保持する必要があるためです。では、逆側からこの関連付けを取得する必要がある場合はどうなるでしょうか? . 私の問題を示すコードサンプルは次のとおりです。
$product->addCategory($category);
$category->addProduct($product);
この双方向の関連付けでは、$category::addProduct
関数は によって作成された CategoryProduct エンティティのインスタンスをどのように知ることができます$product::addcategory
か? リスクは、同じ関連付けに対して 2 つの類似した結合エンティティを作成することであり、それを回避する方法がわかりません。