2016-12-14 781 views
2

我有兩個表,tutorial:id,titletutorial_tags:id,tutorial_id,titlelaravel ORM關係:LEFT JOIN像右表

tutorial模型的關係是這樣定義的可選的條件查詢:

function TutorialTag(){ 
     return $this->hasMany('App\TutorialTag'); 
    } 

我想左連接tutorialstutorial_tags,像(請忽略語法錯誤):

select tutorials.* , tutorial_tags.* from `tutorials` left Join 
`tuotrial_tags` ON tutorials.id = tutorial_tags.tutorial_id 

,但我希望能夠ŧ Ø如果用戶在tutorial_tags使用條件要搜索一個特定的標籤:如果我使用whereHas這樣

select tutorials.* , tutorial_tags.* from `tutorials` left Join 
`tuotrial_tags` ON tutorials.id = tutorial_tags.tutorial_id 
where tutorial_tags.title = 'ABC' 

$tutorials = Tutorial::whereHas('TutorialTag',function ($query){ 
     if(isset($_GET['tag'])) 
      $query->where('title',$_GET['tag']); 
    })->get(); 

我不明白這是沒有任何標記的教程,基本上它的工作原理是內部聯接。

,如果我使用with

$tutorials = Tutorial::with(['TutorialTag'=>function($query){ 
     if(isset($_GET['tag'])) 
      $query->where('title',$_GET['tag']); 
    }])->get(); 

然後生病得到兩個單獨的查詢與海誓山盟沒有影響,基本上就tutorial_tagswhere conditiontutorials沒有影響,我得到的所有的教程,包括那些沒有sreached標籤,這裏是查詢日誌:

Array 
(
    [0] => Array 
     (
      [query] => select * from `tutorials` 
      [bindings] => Array 
       (
       ) 

      [time] => 0 
     ) 

    [1] => Array 
     (
      [query] => select * from `tutorial_tags` where `tutorial_tags`.`tutorial_id` in (?, ?, ?) and `title` = ? 
      [bindings] => Array 
       (
        [0] => 1 
        [1] => 2 
        [2] => 3 
        [3] => ABC 
       ) 

      [time] => 2 
     ) 

) 

我怎樣才能得到LEFT JOIN像右表與可選的條件查詢

回答

0

這不是一個有效的sql查詢,但您可以使用laravel collections和一個額外的查詢來解決問題。

抓住所有的路口:

$tutorials1 = Tutorial::whereHas('TutorialTag',function ($query){ 
    if(isset($_GET['tag'])) 
     $query->where('title',$_GET['tag']); 
})->get(); 

抓住休息:

$tutorials2 = Tutorial::doesntHave('TutorialTag')->get(); 

合併兩個集合:

$tutorials = $tutorials1->merge($tutorials2); 
0

爲了獲得左連接查詢請執行下列操作

$tutorials = Tutorial::leftJoin('tutorial_tags', 'tutorials.id', '=', 'tutorial_tags.tutorial_id') 
       ->where(function($query){ 
         if(isset($_GET['tag']) { 
          $query->where('tutorial_tags.title' , $_GET['tag']; 
         } 
       }); 

這會給你以下的輸出: 案例1:如果標籤參數被提供

SELECT * FROM tutorials LEFT JOIN tutorial_tags ON tutorials.id = tutorial_tags.tutorial_id WHERE tutorial_tags.title = 'ABC'; 

案例2:當已經沒有提供標籤參數

SELECT * FROM tutorials LEFT JOIN tutorial_tags ON tutorials.id = tutorial_tags.tutorial_id;