如何覆盖 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
我有一个名为 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