如何根据调用的模型按角色过滤用户?
How to filter User by role based on the called Model?
我正在使用 Laratrust
来管理这些角色:
- 患者
- 医生
我有一个名为 User
的 class,它是主要实体,然后我有一个特定的 class 用于每个角色:Patient
和 Doctor
.
问题
要检索具有 doctor
角色的用户列表,我必须写:
User::whereRoleIs('doctor')->get();
问题是我在 class Doctor
中定义了一些关系,例如:
<?php
namespace App\Models;
use App\Models\Boilerplate\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Doctor extends User
{
use HasFactory;
protected $table = 'users';
public function patients()
{
return $this->belongsToMany(Patient::class, 'invites', 'doctor_id', 'user_id');
}
}
而且我无法从 User
模型访问关系 patients
。
有没有办法自动调用 Doctor:with('patients')->get()
和 return 具有 Doctor
角色的用户?
所以如果我输入:Doctor:all()
结果必须等于 User::whereRoleIs('doctor')->get()
我该怎么做?
像这样按模型拆分数据并不是模型的真正用途。 Laravel 中的模型包含基于 per-table 的数据。为了实现你想要的,我要么制作一个 DocterService
,其中包含通过调用 User::whereRoleIs('doctor')
检索医生用户的方法,要么直接使用这个方法。
如果您真的想使用该模型,尽管您可以使用范围。 (https://laravel.com/docs/9.x/eloquent#query-scopes) 创建一个包含 whereRoleIs('doctor')
方法的新作用域
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class DoctorScope 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)
{
$builder->whereRoleIs('doctor');
}
}
并通过向模型添加以下内容将其应用于模型:
/**
* The "booted" method of the model.
*
* @return void
*/
protected static function booted()
{
static::addGlobalScope(new DoctorScope);
}
我正在使用 Laratrust
来管理这些角色:
- 患者
- 医生
我有一个名为 User
的 class,它是主要实体,然后我有一个特定的 class 用于每个角色:Patient
和 Doctor
.
问题
要检索具有 doctor
角色的用户列表,我必须写:
User::whereRoleIs('doctor')->get();
问题是我在 class Doctor
中定义了一些关系,例如:
<?php
namespace App\Models;
use App\Models\Boilerplate\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Doctor extends User
{
use HasFactory;
protected $table = 'users';
public function patients()
{
return $this->belongsToMany(Patient::class, 'invites', 'doctor_id', 'user_id');
}
}
而且我无法从 User
模型访问关系 patients
。
有没有办法自动调用 Doctor:with('patients')->get()
和 return 具有 Doctor
角色的用户?
所以如果我输入:Doctor:all()
结果必须等于 User::whereRoleIs('doctor')->get()
我该怎么做?
像这样按模型拆分数据并不是模型的真正用途。 Laravel 中的模型包含基于 per-table 的数据。为了实现你想要的,我要么制作一个 DocterService
,其中包含通过调用 User::whereRoleIs('doctor')
检索医生用户的方法,要么直接使用这个方法。
如果您真的想使用该模型,尽管您可以使用范围。 (https://laravel.com/docs/9.x/eloquent#query-scopes) 创建一个包含 whereRoleIs('doctor')
方法的新作用域
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class DoctorScope 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)
{
$builder->whereRoleIs('doctor');
}
}
并通过向模型添加以下内容将其应用于模型:
/**
* The "booted" method of the model.
*
* @return void
*/
protected static function booted()
{
static::addGlobalScope(new DoctorScope);
}