2014-12-05 12 views
6

Ho invano cercato di leftjoin e ottenere i dati richiestisinistra si uniscono per ottenere una singola riga in laravel

Ecco il mio codice:

$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(); 

I commenti sono alcune delle mie numerose provare .. .

voglio ottenere solo un singolo record dalla foto tavolo corrispondenza della chiave esterna album_id che è stato aggiornato prima e poi con lo stato 1

pls help ...

+0

L'aggiunta di '$ query-> take (1);' prima che le due righe commentate siano d'aiuto? – NorthBridge

+0

'Chiama al metodo non definito lluminate \ Database \ Query \ JoinClause :: take()' error @NorthBridge – Ronser

risposta

5

ho usato DB::raw() al fine di raggiungere questo

$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(); 

codifica @JarekTkaczyk s' era simile e visualizzato lo stesso risultato che mi serviva, quindi un ringraziamento speciale a lui per il suo tempo e fatica ...

0.123.

Ma confrontando il tempo di esecuzione per la quires io siamo stati al mio come il mio sopra frammento

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' 

preso 520μs - 580μs

e @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` 

preso 640μs - 750μs Ma entrambi hanno fatto lo stesso ...

0

Stai cercando di verificare la presenza di album con stato '1'? Se questo è il caso, ti manca un segno di uguale dal tuo finale dove.

Prova:

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

In alternativa si può essere in grado di raggiungere questo obiettivo con una 'on' al posto di un 'dove' all'interno della funzione join. Inoltre non c'è bisogno di dividere interrogazione all'interno della funzione e può fare come una linea con il '->':

$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(); 

È necessario assicurarsi che si sta utilizzando 'prima', in quanto restituirà una singola riga del primo risultato. Get() restituirà un array.

+0

ho bisogno di un elenco di tutti gli album con una singola foto – Ronser

5

si può raggiungere utilizzando leftJoin o rightJoin (ma quest'ultimo sarebbe tornato Photo modelli, quindi probabilmente non sarà necessario che):

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

benvenuto buddy @JarekTkaczyk, ho fatto lo stesso con leggera variazione e prima di pubblicare questo +1 – Ronser

+0

pls mi aiuta in questo http: // StackOverflow.com/q/27266086/3928375 @JarekTkaczyk – Ronser

+0

@Ronser hai la risposta lì, è corretta. E se non è quello che vuoi ottenere, quindi riformulare la domanda e dire precisamente quale risultato ti aspetti, e poi fammi sapere. –

0

Come una risposta diretta che risulta in un singolo oggetto Suggerisco la seguente query:

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