2016-04-14 59 views
10

在我Laravel应用程序,我有以下类:HasManyThrough多态和许多一对多关系

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'); 
    } 
} 

我可以很容易地得到使用Bar::find(1)->product->users酒吧对象的用户,我也可以得到一个酒吧用户User::find(1)->products

如何获得属于特定foo的所有酒吧的用户?也就是说,Foo::find(1)->users应该返回有属于ID为1到foo它基本上hasManyThrough多态和许多一对多关系吧的所有用户。

回答

2

尝试这样:

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

应该为你工作(代码已经过测试,但不反对完全相同的结构,你的设置)。第一行将返回所有深入嵌套关系的用户。第二行将拉出用户,将它们压扁成数组,然后将数组转换为集合。

+0

这似乎包括不与给定富 –

+0

使用,而不是一个'GET'语句'find'声明,那么用户:'$美孚=静::用([“酒吧”,“酒吧。产品','bars.product.users']) - > find($ this-> id);'(假设你的主键是'id') –