HasManyThrough具有多态和多对多关系

时间:2016-04-14 18:14:56

标签: laravel eloquent many-to-many has-many-through

在我的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,具有多态和多对多关系。

2 个答案:

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