2017-01-05 2 views
1

Ich habe eine viele zu viele Beziehung zwischen Listen und Benutzern. Dies ist die Liste Modell:Laravel 5 - Eloquent: einfacher Weg, eine viele zu viele Beziehung zu filtern

class ListModel extends Model 
{ 
    protected $table = "lists"; 

    public function users() 
    { 
    return $this->belongsToMany('App\Models\User', 'list_user', 'list_id', 'user_id')->withTimestamps(); 
    } 

} 

Dies ist das User-Modell:

class User extends Authenticatable 
{ 

    public function lists() 
    { 
    return $this->hasMany('App\Models\ListModel'); 
    } 
} 

In einer Liste Seite, muss ich den angemeldeten Benutzer gehören alle Listen bekommen. Die einzige Lösung, die ich gefunden ist diese:

$user = \Auth::user()->id; 
$all_lists = ListModel::whereHas('users', function ($query) use ($user) { 
    $query->where('user_id', $user); 
})->active()->get(); 

gibt es eine einfachere Möglichkeit, um das gleiche Ergebnis zu erreichen?

+0

das nützlich gefunden https://laracasts.com/discuss/channels/laravel/how-to-eifrig-load-a-relation-on-authuser – Gayan

Antwort

0

Ihre Listen() Beziehung ist nicht richtig definiert. Die Inverse belongsToMany ist noch belongsToMany (hasMany die inverse wird belongsTo):

class User extends Authenticatable 
{ 

    public function lists() 
    { 
     return $this->belongsToMany('App\Models\ListModel', 'list_user', 'user_id', 'list_id')->withTimestamps(); 
    } 
} 

Dann Sie die Listen wie diese bekommen:

$user = \Auth::user(); 

$all_lists = $user->lists()->active()->get() 
+0

Vielen Dank, es scheint viel sauberer! – Dani

1

Da aktuelle Benutzer bereits geladen ist, können Sie lazy eager loading verwenden, um Listen für den Benutzer zu laden:

auth()->user()->load('lists'); 
+0

Ich habe versucht, aber es gibt nur eine Liste der Benutzer – Dani

+0

@Dani diesen Code kann keine Liste der Benutzer zurückgeben. Es scheint, dass Sie den Code geändert haben. Bitte zeigen Sie mir den genauen Code, den Sie gerade verwenden. –

+0

Ich habe gerade diesen genauen Code getestet und es funktioniert perfekt für Viele-zu-viele-Beziehung. –