在我的Laravel应用程序中,我有以下类:
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
应该返回所有拥有属于Foo的条形码的用户,其ID为1.它基本上是hasManyThrough,具有多态和多对多关系。
答案 0 :(得分:3)
尝试这样的事情:
public function users()
{
$Foo = static::with(['bars', 'bars.products', 'bars.product.users'])->get();
return collect(array_flatten(array_pluck($Foo, 'bars.*.product.users')));
}
应该适合您(代码已经过测试,但与您的设置完全相同)。第一行将返回通过关系深层嵌套的所有用户。第二行将拉出用户,将它们展平成一个数组,然后将数组转换为一个集合。
答案 1 :(得分:0)
我为以下情况创建了HasManyThrough
关系:Repository on GitHub
安装后,您可以像这样使用它:
class Foo extends Model {
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
public function users() {
return $this->hasManyDeep(
User::class,
[Bar::class, Product::class, 'products_users'],
[null, ['extended_type', 'extended_id']]
);
}
}