2015-11-24 71 views
3

關於Laravel的查詢構建器的一些noob問題。 我想給簡單的SQL查詢翻譯:是否可以從沒有DB的多個表中選擇:Raw?

SELECT s.name, e.name, m.name 
FROM sports as s, events as e, matches as m 
WHERE s.name = 'Football' 

哪裏體育 - >活動 - >配襯有1 - >氮與

  • 比賽有事項標識外鍵
  • 事件有一個sport_id外鍵,
  • 運動是根。

因此,與s.name上述選擇查詢=「足球​​」給出:

+----------+-------------+----------------------+ 
| name  | name  | name     | 
------------------------------------------------- 
|Football | World Cup | England vs Germany | 
|Football | World Cup | Argentina vs France | 
| ...  | ...   | ...     | 
------------------------------------------------- 

我想它在Laravel查詢生成器查詢轉換,而無需使用DB:生,和我有點困惑,因爲文檔中顯示的所有示例都以DB:table(blabla)開始,它似乎只接受1個表作爲參數。 因此,像

$events = DB::table('sports as s', 'events as e') 
->select('s.name', 'e.name') 
->where('s.name', '=', 'Football') 
->get(); 

說e.name被認爲是未知的。 我讀過一些使用數據庫的答案:Raw或一些奇怪的連接。

所以......你們知道任何Laravel的查詢生成器優雅的方式來處理這些查詢嗎?或者我必須堅持DB:Raw?

提前致謝!

+0

體育,賽事和比賽之間是否有聯繫? – ollieread

+0

你說得對,對不起,我忘了說 – Hector

回答

2

我相信你要做的是在你的三個表格之間建立一個聯合。

http://laravel.com/docs/5.1/queries#unions

$first = DB::table('users') 
      ->whereNull('first_name'); 

$users = DB::table('users') 
      ->whereNull('last_name') 
      ->union($first) 
      ->get(); 

的unionAll方法也可用並且具有相同的方法 簽名工會。

如果您想查詢匹配表中的匹配,則使用連接,然後加入match_id = event_id時匹配的事件。

1

浪費相當長的一段時間後好了,我發現:

  • 使用SELECT WHERE上的多個表,而不是明確的JOIN被認爲是不好的做法,本質上是代碼的可讀性。
  • 有可能沒有辦法跟Laravel的Query Builder來實現我想要的東西(壞的實踐方式),而無需使用DB:生
  • ,解決我的問題,正確的方法是:

    $events = DB::table('sports as s') 
         ->join ('events as e', 'e.sport_id', '=' , 's.id') 
         ->join ('matches as m', 'm.event_id', '=' , 'e.id') 
         ->select('s.name as sname', 
            'e.name as ename', 
            'm.name as mname') 
         ->get(); 
    

(工程罰款至少)

  • 那你MUST別名在SELECT WH名稱這些字段的名稱是相同的,或者對於所有相同的名稱只有一列(這是我失去了一段時間:))。

  • 我試着用Yii框架和「壞的實踐方式」運行良好,以及連接方法:

    $query = (new \yii\db\Query()) 
    ->select(['sport_name' => 's.name','event_name' => 'e.name']) 
    ->from(['s' => 'sports','e' => 'events']) 
    ->where(['s.name' => 'Football']) 
    ->all(); 
    

我希望這會幫助別人,

再見。

相關問題