0

非常に基本的な構造があると仮定します。Aには次Categoryの複数の項目を含めることができますProduct

/**
 * @ORM\OneToMany(targetEntity="Product", mappedBy="category", cascade="remove")
 */
protected $products;

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
 */
protected $category;

次のようなカテゴリからアクセスすると、すべての製品が表示されます。

$category->products;

Productaに属性があるとしましょうinvisibleDoctrineに表示されている製品のみをロードさせるにはどうすればよいですか?このクエリはどこに置きますか?リポジトリ?しかし、より:どうすればそれを呼び出すか、「すべてをロード」と「特定をロード」を切り替えることができますか?もちろん、製品を個別にリクエストすることもできますが、これは良い解決策ではないようです。

4

3 に答える 3

1

私の意見では、より良い解決策はDoctrineフィルターの使用です(Doctrine 2.2以降を使用している場合)

ドクトリンフィルターマニュアル

非表示プロパティのカスタムフィルターを定義し、エンティティマネージャーを介していつでも有効/無効にすることができます。

于 2012-12-17T19:40:46.103 に答える
1

最も簡単な方法は、カテゴリ-> getProducts()メソッドに可視性パラメータを追加することです。

class Category
{
public function getProducts($invisible = false)
{
    if ($invisible) return $this->products;

    $visibleProducts = array();
    foreach($this->products as $product)
    {
        if ($product->isVisible()) $visibleProducts[] = $product;
    }
    return $visibleProducts;
}

これはすべての製品のロードを妨げるものではありませんが、必要な製品を簡単に決定する方法を提供します。また、実装は非常に簡単です。後で調整できます。

2番目のアプローチは、クエリを作成してすべてのカテゴリに製品をロードすることです。これにより、製品の遅延読み込みが回避され、必要な製品を正確に指定できるようになります。

そして最後に、@ w1ckedの提案に従って、D2フィルターを作成することができます。プロセスを理解するには少し努力が必要です。

于 2012-12-17T21:49:50.180 に答える
0

1つの解決策は、「visibleProduct」エンティティを作成し、Single-Table-Inheritance(http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance )を使用することです。 )そしてカテゴリから2番目の関係を作成します。

于 2012-12-17T15:18:26.120 に答える