【问题标题】:How can i use related model scope inside whereHas Laravel 8我如何在 whereHas Laravel 8 中使用相关模型范围
【发布时间】:2021-03-16 07:44:27
【问题描述】:

我有两个模型。 TaskTaskCheck

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中的作用域不是hasOwner(),它是ownedBy()
  • 天哪。这么简单的错误。谢谢就是这样。如果您将此作为答案发送,我会接受它

标签: laravel scope eloquent-relationship


【解决方案1】:

在您的TaskCheck 模型中,您有ownedBy() 范围,但您在whereHas 查询中调用了hasOwner()

将您的查询更改为ownedBy()

$query->whereHas('taskCheck', function ($q) use ($taskOwnerId) {
    $q->ownedBY($taskOwnerId);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 2021-03-22
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多