Laravel角色HasMany关系
Laravel Role HasMany relationship
我有一个 User Model
和一个 Role Model
,它们是多对多关系。
我有两个角色:管理员和经理。
我也有一个Order Model
。经理需要有很多订单。我在哪里陈述这种关系?我必须在用户 Class 中说明吗?
我需要为管理员和经理创建单独的模型吗?
User
和 Role
之间的多对多关系可以用 belongsToMany
Eloquent 两种关系方法完美描述。此外,由于每个 Order
必须有负责的经理,我们在 Manager
和 Order
之间也有一对多关系,将用 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');
}
}
我有一个 User Model
和一个 Role Model
,它们是多对多关系。
我有两个角色:管理员和经理。
我也有一个Order Model
。经理需要有很多订单。我在哪里陈述这种关系?我必须在用户 Class 中说明吗?
我需要为管理员和经理创建单独的模型吗?
User
和 Role
之间的多对多关系可以用 belongsToMany
Eloquent 两种关系方法完美描述。此外,由于每个 Order
必须有负责的经理,我们在 Manager
和 Order
之间也有一对多关系,将用 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');
}
}