Laravel访问一对多的多态对象

时间:2016-01-07 09:12:11

标签: php laravel laravel-5 eloquent polymorphic-associations

我有这张桌子:

user_permissions
----------------
id
user_id
permissable_id
permissable_type

permissable_type可以是任何东西。这就是我如何控制某些能力的权限。其中一个可能的permissable_types是App \ Models \ Product。如果用户只能使用5种产品中的2种,则user_permissions表中将有2行。获得这2个权限的最佳方法是什么? 我有return $this->hasMany('UserPermission'); 这给我带来了2个userPermission对象,但是我希望得到一个Products而不是UserPermissions的集合。这样做的最佳方式是什么?

我在Laravel 5.0上

1 个答案:

答案 0 :(得分:1)

您的user_permissions表设置为polymorphic relationship。这些字段已经正确命名和所有内容。如果你有这种关系设置,这应该很容易。

听起来您正在为特定用户寻找一组产品。用这种方式表达它会让你获得所需的代码:

// "I want Products that have a specific user"
$products = \App\Models\Product::whereHas('permissions.user', function($q) use ($user) {
    $q->where('id', $user->id);
});

如果您的关系尚未设置,则可以了解它们的外观:

class UserPermission {
    public function user() {
        return $this->belongsTo(User::class);
    }

    public function permissable() {
        return $this->morphTo();
    }
}

class Product {
    public function permissions() {
        return $this->morphMany(UserPermission::class, 'permissable');
    }
}