Laravel Role HasMany关系

时间:2018-09-28 06:24:43

标签: laravel class model roles

我有一个User Model和一个Role Model,它们之间存在多对多关系。 我有两个角色:管理员和经理。 我也有一个Order Model。经理需要下很多订单。我在哪里声明这种关系?我必须在用户类别中声明吗? 我需要为管理员和管理员创建单独的模型吗?

2 个答案:

答案 0 :(得分:1)

User的雄辩关系方法都可以完美地描述您在RolebelongsToMany之间的多对多关系。同样,由于每个Order必须有负责的经理,我们在ManagerOrder之间也具有一对多关系,将用hasMany / {{1}进行描述}方法。

因此,您的belongsTo模型将具有:

User

对于您的public function roles() { return $this->belongsToMany('App\Role'); } public function orders() { return $this->hasMany('App\Order'); } 模型:

Role

最后是您的public function users() { return $this->belongsToMany('App\User'); } 模型:

Order

在数据库架构级别上无需创建某些限制(例如“只有具有角色管理器的用户才能下订单”),因此在代码中更容易实现。因此,例如,您可能想要实现一种方法,该方法将为用户分配顺序并首先检查其角色。

答案 1 :(得分:1)

经理和管理员是用户的一个子集,由其角色定义。

因此,我们将使用作用域按角色来过滤作为管理员的用户。

App \ Scopes \ ManagerUserScope.php

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class ManagerUserScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        //Assuming Your user has a relationship (has many) role
        $builder->whereHas('role', function($roleQuery) {
            //Assuming that in the role table, the manager role entry has ID 1
            $roleQuery->where('id','=',1);
        });
    }
}

然后,我们扩展User模型以创建具有自动应用上述范围的管理器模型。

App \ Models \ Manager.php

namespace App\Models;

use App\Scopes\ManagerUserScope;

class Manager extends User {

    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new ManagerUserScope);
    }

    /**
    *  Relationship: Orders (Has many)
    */
    public function orders()
    {
        return $this->hasMany('orders');
    }   
}