如何根据调用的模型按角色过滤用户?

How to filter User by role based on the called Model?

我正在使用 Laratrust 来管理这些角色:

我有一个名为 User 的 class,它是主要实体,然后我有一个特定的 class 用于每个角色:PatientDoctor.

问题

要检索具有 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);
    }