Laravel角色HasMany关系

Laravel Role HasMany relationship

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

UserRole 之间的多对多关系可以用 belongsToMany Eloquent 两种关系方法完美描述。此外,由于每个 Order 必须有负责的经理,我们在 ManagerOrder 之间也有一对多关系,将用 hasMany/[=20= 描述] 方法。

因此,您的 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 型号:

public function manager()
{
    return $this->belongsTo('App\User');
}

无需在数据库架构级别创建某些限制(如 "only users with role manager can have orders"),在代码中更容易实现。因此,例如,您可能想要实现一种方法,该方法将向用户分配顺序并首先检查他的角色。

经理和管理员是用户的子集,由他们的角色定义。

因此,我们将使用范围来按角色过滤担任经理的用户。

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