HasManyThrough具有多态性和多对多关系



在我的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']]
        );
    }
}

最新更新