laravel - 我如何在 whereHas Laravel 8 中使用相关模型范围
问题描述
我有两个模型。Task
和TaskCheck
在TaskCheck
我有
class TaskCheck extends Model
{
public function task(): BelongsTo
{
return $this->belongsTo(Task::class);
}
public function owner(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
public function scopeOwnedBy(Builder $query, int $userId): Builder
{
return $query->where('user_id', '=', $userId);
}
}
在Task
我的模型中
class Task extends Model
{
public function taskCheck(): HasMany
{
return $this->hasMany(TaskCheck::class)->with(['taskState', 'owner']);
}
}
并想使用这样的东西:
public function scopeHasOwner(Builder $query, int $taskOwnerId): Builder
{
return $query->whereHas('taskCheck', function ($q) use ($taskOwnerId) {
$q->hasOwner($taskOwnerId);
});
}
但是这会引发异常Call to undefined method App\Models\Task::hasOwner()
,因为内部查询似乎不知道任务模型。
我知道我可以改用它并且它有效
public function scopeHasOwner(Builder $query, int $taskOwnerId): Builder
{
return $query->whereHas('taskCheck', function ($q) use ($taskOwnerId) {
$q->where('user_id', '=', $taskOwnerId);
});
}
但我宁愿不在每个相关模型中重复 where 子句,因为在关系中存在更多相关模型,它们将使用类似的功能,而我只想将它放在一个地方。
解决方案
在您的TaskCheck
模型中,您有ownedBy()
范围,但您hasOwner()
在whereHas
查询中调用了。
将您的查询更改为ownedBy()
$query->whereHas('taskCheck', function ($q) use ($taskOwnerId) {
$q->ownedBY($taskOwnerId);
});
推荐阅读
- r - 基于另一列在 DF 上创建迭代器
- javascript - Vue.js 使用给定的 html 数据
- python-3.x - 如何在 Flask-Admin 中禁用导航栏?
- mysql - 在 Node.js 中同时生成的发票具有相同的编号。如何实现独特性?
- jquery - 如果数据库中存在记录,则执行条件
- python-3.x - 为什么总是“模块'xxx'没有属性'xxx'”?
- bash - 如何在 bash 中并行执行脚本?
- node.js - 在 Windows 上的 package.json 脚本中使用 NODE_PATH 变量
- devise - 将 devise-jwt 添加到 rails api -> 如何在为 JWTBlacklist 生成模型时解决问题?
- algorithm - 生成随机数但排除多个范围而不循环