Propel 2でかなり簡単なクエリを実行しようとしています。私はPersonテーブルとPossessionテーブルを持っています。だから1人の本、1台の車を持っている人がいます。私はPropelに車を持っている人の車名とともにすべての人を返すような質問を書こうとしています。コードと結果のクエリは次のとおりです。PropelはJOINテーブルへのエイリアスを使用するときにクエリにCROSS JOINを追加します
$x = PersonQuery::create()
->groupById()
->leftJoinPossession()
->addJoinCondition('Possession','Possession.possession_type = ?', 'car')
->withColumn('Possession.possession_name', 'CarName')
->where('Possession.possession_name IS NOT NULL')
->find()
->toString();
//resulting sql
SELECT person.id, possession.possession_name as CarName
FROM person
LEFT JOIN possession ON (person.id=possession.person_id AND possession.possession_type = 'car')
WHERE possession.possession_name IS NOT NULL;
これは期待どおりに動作します。しかし、私は別名を使用する必要があるので、所有テーブルに複数の結合を行う必要があります(たとえば各人の本を入手する必要があります)。ここで私はちょうど所持テーブルの別名を使用する(とも一人一人のための本を取得するために)以前のクエリを変更するときに何が起こるかです:Propelが追加何らかの理由
$x = PersonQuery::create()
->groupById()
->leftJoinPossession('p')
->addJoinCondition('p','p.possession_type = ?', 'car')
->leftJoinPossession('p2')
->addJoinCondition('p2','p2.possession_type = ?', 'book')
->withColumn('p.possession_name', 'CarName')
->withColumn('p2.possession_name', 'BookName')
->where('p.possession_name IS NOT NULL')
->find()
->toString();
//resulting sql
SELECT person.id, p.possession_name as CarName, p2.possession_name as BookName
FROM person
CROSS JOIN possession
LEFT JOIN possession p ON (person.id=p.person_id AND p.possession_type = 'car')
LEFT JOIN possession p2 ON (person.id=p2.person_id AND p2.possession_type = 'book')
WHERE p.possession_name IS NOT NULL;
あなたが見ることができるように、「CROSS JOINは「所有」をクエリに追加します。これはクエリの結果を変更するものではありませんが、非常に遅くなります。私が参加したテーブルのエイリアスを使用している間にPropelがCROSS JOINを使用しないように指示する方法についてのアイデアはありますか? ( 'where'句を取り除くと、CROSS JOINも消えます)
は、私は複数所持テーブルにジョインを使用できるようにする必要があります。
一方、ここにあなたがこれらの条件をチェックし、必要な例外をスローしてみましょうヘルパーコードと要旨です。元の投稿の2番目のコードブロックを編集して、私が少し明確にする必要があることを示しました。私がしようとしていることのためにあなたの方法でクエリを構築するとは思えません。 – zeke
私はそれがなぜないかわかりません。前述したように、usePossessionQueryのエイリアスを指定することができます(これは最初のパラメータです)。複数の結合の例を使って投稿を更新します。 – chocochaos