是否可以在执行leftjoin时限制结果?
(Laravel 4.2) - Querybuilder
我用laravel的querybuilder获得了以下查询:
DB::table('part')
->leftjoin('model', 'model.model_id', '=', 'part.model_id')
->leftjoin('make', 'model.make_id', '=', 'make.make_id')
->leftJoin('photo', 'photo.part_id', '=', 'part.part_id')
->select( 'part.part_id',
'part.model_id',
'make.desc as make_desc',
'model.desc as model_desc',
'photo.local as local_img',
'photo.cdn as cdn_img')
->take(8)->get();
每个部分都有超过4张照片,但我只希望第一张照片包含在连接中。问题是,当我使用此查询时,我得到8个部分对象(结果)。但是8个结果不是8个部分,而是2个部分。此查询创建4个相同的零件对象,唯一的区别是照片(连接包括每张照片)。
我尝试过这样的事情:
->select( '(photo.local LIMIT 1) as local_img',
'(photo.cdn LIMIT 1) as cdn_img')
但这不起作用。我也尝试过做原始查询。我还尝试在leftjoin闭包中使用' - > take(1)',如下所示:
->leftjoin('photo', function($q){
$q->on('photo', 'photo.part_id', '=', 'part.part_id')->take(1);
});
但这是不可能的。
我正在搜索只包含左连接中第一个照片行的解决方案。
编辑:跟进mgrueter的回答。我知道groupby可以做到这一点,但这会使查询变得非常慢。所以我想以不同的方式做到这一点,因此查询不会变慢。
答案 0 :(得分:0)
按'part.id'对结果进行分组:
DB::table('part')
->leftjoin('model', 'model.model_id', '=', 'part.model_id')
->leftjoin('make', 'model.make_id', '=', 'make.make_id')
->leftJoin('photo', 'photo.part_id', '=', 'part.part_id')
->select( 'part.part_id',
'part.model_id',
'make.desc as make_desc',
'model.desc as model_desc',
'photo.local as local_img',
'photo.cdn as cdn_img')
->group_by('part.part_id')
->take(8)->get();
还可以通过'photo.created'或您要确定的任何列来排序结果,这是第一张照片。