2017-03-15 12 views
0

これは私のための頭のスクラッチャーのビットされているので、私は本当にこの1つの入力を感謝します。リレーションシップの組み合わせによる教義フィルタ

カテゴリ>製品>バリアント>バリアントプロパティの4つのエンティティがあります。

VariantPropertyはキー値のペアです(例: 'Color' => 'Blue')。製品には多くのバリアントがあり、カテゴリには多くの製品があります。

私は、Productリポジトリから、VariantPropertiesの一致するセットを持つバリエーションを含む製品を見つける方法を考えようとしています。条件がafaikの関係深度とどのように機能し、リポジトリメソッドを使用するかによって条件が機能しません。VariantPropertyに一致するバリアントを持つ製品を見つけるためにフィルタリングできます。

私はVariantPropertiesのセットでフィルタリングする方法を考えることはできません。コードでそれをやろうとしましたが、私たちが持っているバリエーションの量では、私は100MB +を使いすぎてしまいます。

カテゴリの製品への多対多の関係を持っている 製品は、バリアント にOneToManyの関係を持っており、変異体はVariantPropertiesにOneToManyの関係を持っています。

これは、バリアントごとにさまざまな種類のプロパティがあるために行われます。

私の唯一の他の考えは、VariantPropertiesのバリエーションIDでグループ化され、そこから出てくる一致するセットを見つけることでしたが、それは私にとってややハッキリなようです。

+0

なぜあなたは、カテゴリリポジトリにこれを実行しようとしていますか?製品を探したい場合は、製品リポジトリで作業する必要があります。とにかく、適切な左結合とバリアントプロパティの条件を使ってDQLでクエリを実行することはできませんか?何か不足していますか? – ste

+0

私は謝罪しました、私は製品リポジトリを意味しました。今修正しました。私は、私はおそらく何かが欠けていることができると確信していますが、それは唯一のVariantPropertyエンティティのセットと一致したバリアントの製品を返すように私は、クエリを構築するための最善の方法を考えることはできません。つまり、私はVariantPropertyエンティティ一致する「色」=>「赤」との関係と実体一致する「幅」=>「8088」を持つ変種で製品を見つける必要があります。私はおそらくこの時点で明らかに何かを見逃しているでしょう。 – Andre

答えて

1

私が考えることができる唯一の実現可能な方法は、あなたの興味のある変異体に、GROUP BY productHAVING COUNT(variant) = :expetedVariantsを組み合わせたJOIN(左手なし)です。

私は擬似DQLの切れ端で説明しよう、2つの亜種によるフィルタリング:

SELECT p 
FROM product 
JOIN variant 
JOIN variantProperty 
WHERE 
    (variantProperty.name = variantName1 AND variantProperty.value = variantValue1) 
    OR 
    (variantProperty.name = variantName2 AND variantProperty.value = variantValue2) 
GROUP BY product 
HAVING COUNT(variantProperty) = 2 
+0

+1これはまさに必要なものでした。ありがとうございました。私はそれが他の人に役立つ場合、私が共有して喜んでそれの実装を持っています。 – Andre

0

あなたは、製品のリポジトリにこのような何かをしようとしたことがありますか?

public function findByProperties($properties) 
{ 
$qb=$this->createQueryBuilder('prod') 
    ->addSelect('var', 'varpro') //can remove if you don't want to hydrate these objects 
    ->join('prod.variants', 'var') 
    ->join('var.variantProperties', 'varpro'); 

$expr=$qb->expr()->orX('1=0'); 
$i=0; 
foreach ($properties as $name => $value) { 
    $expr=$qb->expr()->orX($expr, $qb->expr()->andX('varpro.propertyName = :name'.$i, 'varpro.propertyValue = :value'.$i)); 
    $i++; 
} 

$qb->andWhere($expr); 

$i=0; 
foreach ($properties as $name => $value) { 
    $qb->setParameter(':name'.$i, $name); 
    $qb->setParameter(':value'.$i, $value); 
    $i++; 
} 

return $qb->getQuery()->getResult(); 
} 
関連する問題