2014-12-05 2 views
6

Я безуспешно пытался LeftJoin и получить необходимые данныеВыравнивание по левому краю, чтобы получить одну строку в 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

+0

'Call to undefined method lluminate \ Database \ Query \ JoinClause :: take()' error @NorthBridge – Ronser

ответ

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 «s была похожа и отображается тот же результат, что мне нужно, поэтому отдельное спасибо ему за время и усилия ...

Но сравнение времени выполнения для 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 «s

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»? Если это так, вам не хватает знака равенства из вашего финала, где.

Try:

->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

5

Вы можете достичь его, используя либо leftJoin или rightJoin (но последний вернется 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

welcome buddy @JarekTkaczyk, я сделал то же самое с небольшими вариациями, это +1 – Ronser

+0

PLS помочь мне в этом http: // stackoverflow.com/q/27266086/3928375 @JarekTkaczyk – Ronser

+0

@ У вас есть ответ там, это правильно. И если это не то, чего вы хотите достичь, тогда перефразируйте вопрос и скажите, какой результат вы ожидаете, а затем дайте мне знать. –

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(); 
Смежные вопросы