2015-10-22 17 views
6

私は一緒に参加する複数のテーブルを持っていると私は1つのクエリが必要とすべての参照を取得する!
はyii2で可能ですか?
それらを階層配列で取得しますか?
どのように???yii2の他のテーブルを参照するテーブルを取得するにはどうすればよいですか?

joinを使用しないでください。

ありがとうございます。

sample db

+0

なぜあなたは結合を使用しない**でしょうか? – Sjon

+0

参加することなくpossilbe? lazyloadingまたは何か! – mohsen

+0

私は参加が良いと思う。どのようにあなたの出力を望むかについて私たちにもっと教えていただけますか? –

答えて

1

Giiを使用して各テーブルのモデルクラスを作成し、生成されたモデルでリレーションを作成するように選択した場合は、次のようなことができます。あなたの国での

1)モデルだけでこのような空港との関係を宣言する方法変更:あなたが国のためにクエリを実行すると

public function getAirports() { 
    return $this->hasMany(Airports::className(), ['country_id' => 'id'])->with('airlines'); 
} 

2)、あなたは関連の空港、航空会社を持っている必要がありますそして、このようにそれを行うflightbooked:

$countries = Countries::find() 
    ->where('something = something_else') 
    ->with('airports') 
    ->with('flightbooked') 
    ->all(); 

あなたが遅延ロードを使用するよりもデータベースへの道少ないクエリで埋めすべての関連のモデルを取得します。この道を。

0

たぶんuは、このためのすべての組合を使用することができます。この演算子を使用すると、複数の照会の結果セットを連結し、それぞれの行をすべて保存することができます。 UNION演算子(ALLキーワードなし)は、結果セットに存在する「重複」行を除去することに注意してください。 UNION ALL演算子は、各問合せのすべての行を保持します(重複した検査および削除操作を実行するオーバーヘッドがないため、実行効率が向上します)。

各列の数とデータ型は、各クエリで一致する必要があります。いずれかのクエリに他のクエリよりも多くの列がある場合は、他のクエリにダミー式を含めて、列とデータ型を一致させることがあります。多くの場合、リテラルを返す各クエリのSELECTリストに式の列(余分な列)を入れて、その列の「ソース」であるクエリを明らかにすると便利です。

SELECT 'col1' AS source, col23, col343, col33, d FROM table1 WHERE ... 
UNION ALL 
SELECT 'col2', t2.fee, table2.fi, table2.fo, 'fum' FROM table2 JOIN table3 ON ... 
UNION ALL 
SELECT 'col3', '1', '2', buckle, my_shoe FROM table4 

あなたがすべてで集計操作を実行できるようにするには、カッコのセットでこのようなクエリをラップし、(MySQLの専門用語で、または「派生テーブル」)インライン・ビューとして使用することができます行。例:

しかし、私はより適切な表を結合すると思います。

すると、あなたがテーブルのリレーションを維持していて、GIIを使用してコードを生成した場合、それはあなたのための結合を生成れるように:ホープは、あなたが

+0

はい私は参加が良いと思う! – mohsen

1

私はほんの少しの提案を与えたかったのに役立ちます。どのテーブルのどの列にも簡単にアクセスできます。

しかし、UNIONJOINの代替手段ではありません

関連する問題