【问题标题】:Laravel Role HasMany relationshipLaravel Role HasMany 关系
【发布时间】:2019-03-04 02:35:50
【问题描述】:

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

【问题讨论】:

标签: laravel class model roles


【解决方案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');
    }   
}

【讨论】:

  • 谢谢。这正是我希望找到的!
【解决方案2】:

UserRole 之间的多对多关系可以用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');
}

无需在 DB 架构级别创建某些限制(例如“只有具有角色管理器的用户才能拥有订单”),在代码中实现起来更容易。因此,例如,您可能希望实现一个方法,将顺序分配给用户并首先检查他的角色。

【讨论】:

  • 感谢您的回答。这就是我实际所做的,但我不完全确定是否可以让所有用户都有订单,而只有经理可以。
  • @Zlautumn 也可以查看有关gates 的官方文档。当您需要实施一些基于角色的检查时,这是一种首选方法。在您的情况下,您可以创建一个名为“can-have-orders”的门,如果通过的用户分配了经理角色,则使其返回 true。然后在您的代码中,您将能够使用 Gate 外观或刀片指令(如 @can 等)使用漂亮而简短的检查。
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 2020-03-25
  • 2021-03-22
  • 2021-09-24
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多