2014-12-05 66 views
6

單行我一直不成功嘗試leftjoin並獲得所需的數據LEFT JOIN來獲得Laravel

這裏是我的代碼:

$album = Albums::->where('users_id',$user_id) 
        ->leftJoin('photos',function($query){ 
          $query->on('photos.albums_id','=','albums.id'); 
          $query->where('photos.status','=',1); 

          // $query->limit(1); 
          // $query->min('photos.created_at'); 
        }) 
     ->where('albums.status',1)->get(); 

的意見是我的一些嘗試幾種.. 。

我想從照片表匹配外鍵album_id這是第一次,也有狀態更新只有一個記錄1

請求幫助...

+0

在兩個註釋行之前是否添加了'$ query-> take(1)'? – NorthBridge 2014-12-05 14:14:46

+0

'調用未定義的方法lluminate \ Database \ Query \ JoinClause :: take()'錯誤@NorthBridge – Ronser 2014-12-05 14:20:44

回答

5

爲了達到這個

我已經使用 DB::raw()
$album = Albums::select('albums.*', 
      DB::raw('(select photo from photos where albums_id = albums.id and status = 1 order by id asc limit 1) as photo') ) 
      ->where('users_id',$user_id) 
      ->where('albums.status',1)->get(); 

@JarekTkaczyk的編碼是類似的,當我需要顯示同樣的結果,所以特別感謝他爲他的時間和精力......

但對比爲quires執行時間我留下我的一樣我上面的代碼中

select `albums`.*, (select photo from photos where albums_id = albums.id and status = 1 order by id asc limit 1) as photo from `albums` where `users_id` = '1' and `albums`.`status` = '1' 

520μs - 580μs

和@JarekTkaczyk的

select `albums`.*, `p`.`photo` from `albums` left join `photos` as `p` on `p`.`albums_id` = `albums`.`id` and `p`.`created_at` = (select min(created_at) from photos where albums_id = p.albums_id) and `p`.`status` = '1' where `users_id` = '1' and `albums`.`status` = '1' group by `albums`.`id` 

640μs - 750μs但都做了同樣的...

0

您是否在嘗試檢查狀態爲'1'的相冊?如果出現這種情況,您在最後一個地方錯過了等號。

嘗試:

->where('albums.status','=',1)->first(); 

或者您可能能夠達到這個有「上」,而不是一個「地方」內加入的功能。你也不需要分割該功能的內部查詢,可以做它用一條線「 - >」:

$album = Albums::->where('users_id',$user_id) 
        ->leftJoin('photos',function($query){ 
          $query->on('photos.albums_id','=','albums.id') 
          ->on('photos.status','=',1); 
        }) 
     ->where('albums.status','=',1)->first(); 

你需要確保你使用的是「第一」,因爲它將返回第一個結果的單行。 Get()將返回一個數組。

+0

我需要所有相冊的列表與一張照片 – Ronser 2014-12-06 05:10:47

5

您可以通過實現它要麼leftJoinrightJoin(但後者將返回Photo車型,所以可能你不會需要一個):

Albums::where('users_id', $user_id) 
->leftJoin('photos as p', function ($q) { 
    $q->on('photos.albums_id', '=', 'albums.id') 
    ->on('photos.updated_at', '=', 
     DB::raw('(select min(updated_at) from photos where albums_id = p.albums_id)')) 
    ->where('photos.status', '=', 1); 
}) 
->where('albums.status', 1) 
->groupBy('albums.id') 
->select('albums.*', fields from photos table that you need) 
->get(); 
+0

歡迎好友@JarekTkaczyk,我做了同樣的細微變化,並且在發佈之前這個+1 – Ronser 2014-12-06 04:56:39

+0

請幫我在這個http:// stackoverflow。com/q/27266086/3928375 @JarekTkaczyk – Ronser 2014-12-06 08:53:33

+0

@Ronser你在那裏有答案,這是正確的。如果這不是你想要達到的目標,那麼重新解釋這個問題,準確地說出你期望的結果,然後告訴我。 – 2014-12-06 10:13:04

0

作爲一個直接的答案,導致單個對象我建議以下查詢:

$album = DB::table('albums')->select('albums.*', 'photos.photo') 
    ->join('photos', 'photos.id', '=', 'albums.id') 
    ->where('users_id',$user_id) 
    ->where('albums.status',1) 
    ->first();