2016-04-14 38 views
10

w mojej aplikacji laravel Mam następujących klas:HasManyThrough z polimorficznych i wiele do wielu relacji

class Product extends Model 
{ 
    public function extended() 
    { 
     return $this->morphTo(); 
    } 

    public function users { 
     return $this->belongsToMany('App\User', 'products_users', 'product_id'); 
    } 
} 

class Foo extends Model 
{ 
    public function product() 
    { 
     return $this->morphOne('App\Product', 'extended'); 
    } 
    public function bars() 
    { 
     return $this->hasMany('App\Bar'); 
    } 
} 

class Bar extends Model 
{ 
    public function product() 
    { 
     return $this->morphOne('App\Product', 'extended'); 
    } 

    public function foo() 
    { 
     return $this->belongsTo('App\Foo'); 
    } 
} 

class User extends Model 
{ 
    public function products() 
    { 
     return $this->belongsToMany('App\Product', 'products_users', 'user_id'); 
    } 
} 

mogę łatwo dostać użytkownikom obiektu kreskowego przy Bar::find(1)->product->users i mogę również uzyskać kraty użytkownik z User::find(1)->products.

Jak mogę uzyskać użytkowników wszystkich pasków należących do konkretnego foo? Oznacza to, że Foo::find(1)->users powinien zwracać wszystkich użytkowników, którzy mają paski należące do Foo o id 1. Jest to w zasadzie hasManyThrough z relacjami polimorficznymi i wiele-do-wielu.

Odpowiedz

2

spróbować czegoś takiego:

public function users() 
    { 
     $Foo = static::with(['bars', 'bars.products', 'bars.product.users'])->get(); 
     return collect(array_flatten(array_pluck($Foo, 'bars.*.product.users'))); 
    } 

Ten powinien praca dla Ciebie (kod został przetestowany, ale nie na dokładnie tej samej struktury, jak konfiguracji). Pierwsza linia zwróci wszystkich użytkowników głęboko zagnieżdżonych w relacjach. Druga linia wyciągnie użytkowników, spłaszczy je w tablicy, a następnie przekształci tablicę w kolekcję.

+0

Wygląda na to, że użytkownicy, którzy nie są związani z danym Foo –

+0

, używają instrukcji 'find' zamiast instrukcji' get', a następnie: '$ Foo = static :: with (['bars', 'bars. products ',' bars.product.users ']) -> find ($ this-> id); '(zakładając, że klucz podstawowy to' id') –