簡體   English   中英

Laravel Role HasMany關系

[英]Laravel Role HasMany relationship

我有一個多對多關系的User ModelRole Model 我有兩個角色:管理員和經理。 我也有一個Order Model 經理需要下很多訂單。 我在哪里聲明這種關系? 我必須在用戶類別中聲明嗎? 我需要為管理員和經理創建單獨的模型嗎?

UserRole之間的多對多關系可以通過belongsToMany兩種方式的belongsToMany關系方法完美地描述。 同樣,由於每個Order必須有負責的經理,我們在ManagerOrder之間也有一對多的關系,這將通過hasMany / 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模型:

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

無需在數據庫架構級別上創建某些限制(例如“只有具有角色管理器的用戶才能下訂單”),因此在代碼中更容易實現。 因此,例如,您可能想要實現一種將為用戶分配順序並首先檢查其角色的方法。

經理和管理員是用戶的一個子集,由其角色定義。

因此,我們將使用范圍按角色來過濾作為管理員的用戶。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM