2015-10-22 26 views
6

我有多個表連接在一起,我需要一個查詢,並獲得所有參考!
在yii2中可能嗎?
讓他們在層次數組?
如何?如何在yii2中引用其他表格?

是否有可能不使用連接?

感謝您的幫助!!!!

sample db

+0

你爲什麼不**想要使用連接? – Sjon

+0

其possilbe沒有加入?懶加載或東西! – 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

也許ü可以使用UNION ALL這一點。使用此運算符,可以將來自多個查詢的結果集連接在一起,保留每個查詢的所有行。請注意,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行話),這樣就可以對所有的執行聚合操作行。例如:

select one.a 
    , SUM(one.b) 

    FROM (
     SELECT 'q1' AS source, a, b, c, d FROM t1 
      UNION ALL 
     SELECT 'q2', t2.fee, t2.fi, t2.fo, 'fum' FROM t2 
     ) one 
GROUP BY one.a 
ORDER BY one.a 

但我認爲加入表格更合適。希望幫助您

+0

是的,我認爲加入更好! – mohsen

1

我只是想給一個小小的建議:

當你正在維護表中的關係,如果你有使用GII生成的代碼,然後將生成的加入爲您服務。然後您可以輕鬆訪問任何表格的任何列。我想UNION可能不是JOIN的替代方案。