php - Only get the first row while doing a leftjoin -
is possible limit result while doing leftjoin?
(laravel 4.2) - querybuilder
i've got following query laravel's 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 make_desc', 'model.desc model_desc', 'photo.local local_img', 'photo.cdn cdn_img') ->take(8)->get(); every part has more 4 photos, want first photo included in join. problem when use query, 8 part objects (results). 8 results not 8 parts, 2 parts. query creates 4 of same part objects, difference being photo (the join includes every photo).
i tried things like:
->select( '(photo.local limit 1) local_img', '(photo.cdn limit 1) cdn_img') but doesn't work. tried raw query's. tried use '->take(1)' in leftjoin closure, this:
->leftjoin('photo', function($q){ $q->on('photo', 'photo.part_id', '=', 'part.part_id')->take(1); }); but not possible.
i`m searching solution include first photo row in leftjoin.
edit: following on mgrueter's answer. know groupby trick, makes query slow. want in different way query doesn't slow.
group results '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 make_desc', 'model.desc model_desc', 'photo.local local_img', 'photo.cdn cdn_img') ->group_by('part.part_id') ->take(8)->get(); and order results 'photo.created' or whatever column have determine, first photo.
Comments
Post a Comment