我有一个User Model
和一个Role Model
,它们之间存在多对多关系。
我有两个角色:管理员和经理。
我也有一个Order Model
。经理需要下很多订单。我在哪里声明这种关系?我必须在用户类别中声明吗?
我需要为管理员和管理员创建单独的模型吗?
答案 0 :(得分:1)
User
的雄辩关系方法都可以完美地描述您在Role
和belongsToMany
之间的多对多关系。同样,由于每个Order
必须有负责的经理,我们在Manager
和Order
之间也具有一对多关系,将用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');
}
}