2015-05-01 8 views
10

Ich entwickle eine Web-API mit Laravel 5.0, aber ich habe Zweifel über eine Abfrage. Meine Klassen sind diese:Laravel wo auf Beziehung Objekt

class Event extends Model { 

    // 
    protected $table = 'events'; 
    public $timestamps = false; 

    public function partecipants() 
    { 
     return $this->hasMany('App\Partecipant', 'IDEvent', 'ID'); 
    } 

    public function owner() 
    { 
     return $this->hasOne('App\User', 'ID', 'IDOwner'); 
    } 
} 

und

class Partecipant extends Model { 

    // 
    protected $table = 'partecipants'; 
    public $timestamps = false; 

    public function user() 
    { 
     return $this->belongTo('App\User', 'IDUser', 'ID'); 
    } 

    public function event() 
    { 
     return $this->belongTo('App\Event', 'IDEvent', 'ID'); 
    } 
} 

Nun möchte ich mit einem bestimmten partecipant alle Ereignisse erhalten. Ich habe versucht, mit:

Event::with('partecipants')->where('IDUser', 1)->get(); 

aber die Bedingung, wo auf Event-Klasse angewendet wird, und nicht auf partecipants. Dies gibt mir stattdessen eine Ausnahme:

Partecipant::where('IDUser', 1)->event()->get(); 

Ich weiß, dass ich das schreiben kann:

$list = Partecipant::where('IDUser', 1)->get(); 
for($item in $list) { 
    $event = $item->event; 
    ...other code.... 
} 

sind aber nicht zu viele Anfragen an den Server?

Wo ist dann der beste Weg, um diese Abfrage mit Laravel und Eloquent durchzuführen?

+1

Was war die Ausnahme? – infomaniac

Antwort

31

Die korrekte Syntax dies auf Ihre Beziehungen zu tun ist:

Event::whereHas('partecipants', function ($query) { 
    $query->where('IDUser', '=', 1); 
})->get(); 

Lesen Sie mehr bei https://laravel.com/docs/5.0/eloquent#eager-loading

P. S. Es ist "Teilnehmer", nicht "Teilnehmer".

+0

Ich habe versucht, aber dies filtert die Teilnehmer und nicht die Ereignisse, die alle zurückgegeben werden .. Ich würde die Liste aller Ereignisse, die diesen bestimmten Teilnehmer haben. Ps.s. danke für die Korrektur. – Lic

+0

Ich habe jetzt die Antwort aktualisiert, die sollte tun, was Sie wollen. – Crembo

+0

Danke, es war was ich gesucht habe! – Lic