2012-11-02 1 views
27

Sono nuovo di laravel ed eloquente e non sono sicuro che sia possibile. ma ho 2 tavoli con una relazione uno a molti. Uno è "luoghi" e uno è "utenti". Una posizione può avere molti utenti.Laravel eloquente contando una relazione

Quindi, se volevo ottenere tutte le sedi, con tutti gli utenti vorrei solo fare questo:

Location::with("users")->get(); 

ma voglio anche sapere quanti utenti ogni sede ha, Ho provato a fare questo

Location::with("users")->count("users")->get(); 

Ma questo non ha funzionato.

+0

Che cosa hai fatto finora per scoprire? Voglio dire, non che qualcuno suggerisca qualcosa che hai già fatto. – hakre

+0

Se si sta verificando la documentazione ma non si riesce a trovare nulla a riguardo – Arcade

+0

Se 'Posizione :: con (" utenti ") -> get();' poi 'Posizione :: con (" utenti ") -> conteggio() ; 'potrebbe funzionare anche. Hai provato (ho appena scansionato i documenti, non ho mai usato quella libreria)? – hakre

risposta

34

Il problema n + 1 menzionato non si verifica se si utilizza il caricamento ansioso.

$locations = Location::with('users')->get(); 

$locations->users()->count(); 

Ciò dovrebbe comportare tre query, non importa quanti utenti o posizioni si dispone.

  • interrogazione conteggio contro il modello posizione
  • select * from posizioni
  • SELECT * FROM utenti dove nel

La confusione deriva dal fatto che questo funziona anche:

$locations = Location::all(); 

$locations->users()->count(); 

Ma in questo caso, esegue una query una volta per ogni posizione.

Vedere la documentazione per ulteriori informazioni: http://laravel.com/docs/eloquent#eager-loading

+9

Anche se in ritardo per la festa, proprio come per segnalare che si ottiene ancora il problema n + 1 con questo.È necessario utilizzare '$ location> users-> count()' in un foreach, in pratica non accedere al metodo users(), ma accedere alla proprietà o eseguire una query ogni volta. – David

+0

@David grazie mille, hai aiutato a chiarire la confusione mentre stavo ancora vedendo un problema n + 1. Sarebbe utile aggiornare questa risposta per essere più precisi. –

7

è necessario chiamare il metodo di conteggio su ogni record posizione per ottenere contare gli utenti per sede, ecco un esempio:

foreach(Location::get() as $location) // or foreach(Location::with("users")->get() as $location) 
{ 
    echo $location->users()->count(); 
} 

Questo dovrebbe risolvere il problema e per dargli il numero di utenti per ogni posizione. È possibile aggiungere un controllo nel ciclo per ignorare le posizioni con il conteggio degli utenti = 0

+6

Questo dovrebbe utilizzare tutte le query DB risultanti da Location :: get()? –

+32

Questo è male. Ne risulta un [n + 1 problema di query] (http://stackoverflow.com/questions/97197/what-is-the-n1-selects-issue?lq=1) – edi9999

+0

In questo caso, è meglio utilizzare Collection. Perché così usi il PHP per il conteggio delle relazioni. '$ location-> users-> count()' –

Problemi correlati