在我的Laravel应用程序中,我有以下类:
class Product extends Model
{
public function extended()
{
return $this->morphTo();
}
public function users {
return $this->belongsToMany('AppUser', 'products_users', 'product_id');
}
}
class Foo extends Model
{
public function product()
{
return $this->morphOne('AppProduct', 'extended');
}
public function bars()
{
return $this->hasMany('AppBar');
}
}
class Bar extends Model
{
public function product()
{
return $this->morphOne('AppProduct', 'extended');
}
public function foo()
{
return $this->belongsTo('AppFoo');
}
}
class User extends Model
{
public function products()
{
return $this->belongsToMany('AppProduct', 'products_users', 'user_id');
}
}
我可以使用Bar::find(1)->product->users
很容易地获得条形图对象的用户,也可以使用User::find(1)->products
获得用户的条形图。
如何获取属于特定foo的所有条的用户?也就是说,Foo::find(1)->users
应该返回具有属于id为1的Foo的条的所有用户。它基本上具有多态性和多对多关系的ManyThrough。
试试这样的东西:
public function users()
{
$Foo = static::with(['bars', 'bars.products', 'bars.product.users'])->get();
return collect(array_flatten(array_pluck($Foo, 'bars.*.product.users')));
}
这应该适用于您(代码已经过测试,但不是针对与您的设置完全相同的结构)。第一行将返回通过关系嵌套的所有用户。第二行将拉出用户,将他们展开为数组,然后将数组转换为集合。
我为这样的案例创建了一个HasManyThrough
关系:GitHub 上的存储库
安装后,您可以这样使用它:
class Foo extends Model {
use StaudenmeirEloquentHasManyDeepHasRelationships;
public function users() {
return $this->hasManyDeep(
User::class,
[Bar::class, Product::class, 'products_users'],
[null, ['extended_type', 'extended_id']]
);
}
}