我如何在 whereHas Laravel 8 中使用相关模型范围
How can i use related model scope inside 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()
范围,但您在 whereHas
查询中调用了 hasOwner()
。
将您的查询更改为 ownedBy()
$query->whereHas('taskCheck', function ($q) use ($taskOwnerId) {
$q->ownedBY($taskOwnerId);
});
我有两个模型。 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()
范围,但您在 whereHas
查询中调用了 hasOwner()
。
将您的查询更改为 ownedBy()
$query->whereHas('taskCheck', function ($q) use ($taskOwnerId) {
$q->ownedBY($taskOwnerId);
});