2011-11-09 58 views
5

私のアプリケーションでは、関連するテーブルに許可された値のリストを提供するためにいくつかの単純な参照/参照データベーステーブルがあります。Doctrineで参照/参照テーブルへの結合を避ける2

(あなたが知っている、「国のテーブルには、アドレステーブルの「国」フィールドで許可されている国のリストを持っている...)

できるだけ無駄の私のデータモデルを維持するために、私はルックアップテーブルの 'id'列をスキップし、実際の値をプライマリキーとして使用するだけの "Bill Karwin technique"を使用してください。そうすれば、すでに外部キーとして存在しているので、メインテーブルの値を取得するために結合を行う必要はありません。

問題は、Doctrineはすべての関連付けにオブジェクト参照を使用します。つまり、メインテーブルに必要な値が既に存在していても、照会テーブルへの結合がまだ必要です。そうしないとこのエラーが発生した

$qb->select(array('a.id', 'a.street', 'a.city', 'c.country')) 
    ->from('Entity\Address', 'a') 
    ->join('a.country', 'c'); 

たとえば、このクエリは動作しません。

代わり
$qb->select(array('a.id', 'a.street', 'a.city', 'a.country')) 
    ->from('Entity\Address', 'a'); 

を、あなたがこれをしなければならない。」無効なPathExpressionをStateFieldPathExpressionでなければなりません"

ルックアップテーブルに必要なすべての結合を追加します。クエリには多くの不必要なコストがかかります。

Doctrine 2でルックアップ/参照テーブルへの結合を実行する必要がないことを知っている人はいますか?

(PS - 彼らはnot supported by Doctrineだと他のwell-documented disadvantagesを持っているように、私は、列挙型を使用しないように好むだろう。)

答えて

6

はい、この種のは吸うが、私は、彼らがいること、それを行うための十分な理由を持っていたと思います方法。

ヒントHINT_INCLUDE_META_COLUMNSヒントを使用できます。リレーションとしてマップされる外部キーを含むクエリ結果のすべてのフィールドが含まれます。

$query = \Doctrine::em()->createQuery($queryString) 
    ->setParameters($params) 
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, TRUE); 

あなたのあなたはデシベルでAddressテーブルのフィールドcity_idを持っているのであれば、それはまた、「標準」市の関係とともに、クエリ結果に出力されます。

+0

これは素晴らしいことです。setHint()メソッドについてはわかりませんでした。 – cantera

+1

Setヒントは、メタ列を含めるだけでなく、あらゆる種類のものに使用されます。これは、すべてのクエリで実行されるクエリウォーカーを添付する方法です。あなたはまた、あなたが望むことをするあなた自身のヒントを作ることができます。良いことはありません;) – ZolaKt

+0

警告:Doctrineにはnullを保持する外部キーは含まれていません。 city_idが必須でない場合と同様に、常に存在することはありません。それはキャッシュの問題だったと思って、ちょうど2時間を過ごす:) –

関連する問題