2014-12-05 39 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();