如何覆盖 laravel 模型查询?

How to override laravel model query?

我有一个名为 User 的主模型,return 是应用程序的所有用户。

有一个名为 invites 的 table,用于管理受邀访问受邀者面板的用户。 invites table 因此链接到 users:

所以我们有一个通用的 User 模型来处理所有用户,以及其他两类用户:

我想做的是使用 eloquent 关系系统获取某个租户(登录用户)的患者列表,这样我就不必每次都为连接编写查询时间。可以这样做吗?

目前,我试过这个:

class Patient extends User
{
    use HasFactory;

    //protected $table = 'users';

    public function getList()
    {
        return $this->belongsToMany(User::class, 'invites', 'id', 'user_id');
    }
}

但当然这种关系不起作用,因为应该执行的查询必须是这样的:

SELECT u.* 
FROM users u
INNER JOIN invites i ON i.user_id = u.id 
WHERE i.tenant_id = 1

其中 id 是我使用 laratrust auth 检索的当前登录用户的引用:auth()->user()->id.

是否可以 return 自动关联到登录用户的所有患者?所以只需调用:

Patient::query();

我怎样才能做到这一点?

要实现这一点,您应该定义关系并反转多对多关系: 在您的用户模型中:

class Tenant extends User
{
    use HasFactory;

    protected $table = 'users';

    public function patients()
    {
        return $this->belongsToMany(User::class, 'invites', 'tenant_id', 'user_id');
    }
}

并且在患者模型中通过反向belongToMany参数定义反向多对多关系:

class Patient extends User
{
    use HasFactory;

    protected $table = 'users';

    public function tenants()
    {
        return $this->belongsToMany(User::class, 'invites', 'user_id', 'tenant_id');
    }
}

要为每个型号使用授权 ID,您有 2 个选项:

选项 1:

在名为 user_type 的用户 table 中添加列,其类型为 enum('tenant','patient') 并依赖用户类型使用适当的模型

选项 2:

通过使用自定义身份验证守卫,请查看这篇文章

https://www.codecheef.org/article/laravel-8-login-with-custom-guard-example