Laravel - whereHas 查询没有返回正确的记录

Posted

技术标签:

【中文标题】Laravel - whereHas 查询没有返回正确的记录【英文标题】:Laravel - whereHas query not returning correct records 【发布时间】:2021-06-10 13:13:23 【问题描述】:

我目前正在编写搜索查询,但在将 wherewhereHas 连接时遇到问题

如果我只想搜索类别..

如果我只是单独搜索类别,则以下查询有效

 $goals = $myGoals
        ->whereHas('categories', function ($q) use ($search) 
            $q->where('name', 'like', "%$search%");
        )->paginate(10);

如果我只想搜索标题..

如果我想单独搜索目标标题,同上

$goals = $myGoals->where('title', 'like', "%$search%" )->paginate(10);

如果我想单独搜索这两个查询,它们都可以工作。

查询尝试

下面是我编写的查询,允许用户搜索目标的titlecategoryname

 $myGoals = $team->goals();

    $goals = $myGoals
        ->whereHas('categories', function ($q) use ($search) 
            $q->where('name', 'like', "%$search%");
        )->where('title', 'like', "%$search%" )->paginate(10);

我已经尝试了上述查询,但是当我输入输入时搜索结果返回空。我还尝试将where() 交换为orWhere(),然后返回一个不属于$team 模型实例的目标,但它是链接到枢轴内不同Team 模型id 的目标记录表。

谁能发现我哪里出错了?谢谢

【问题讨论】:

【参考方案1】:

你需要在 where 里面全部使用它。

$goals = $myGoals->where(function ($query) use ($search)
                return $query->whereHas('categories', function ($q) use ($search) 
                    $q->where('name', 'like', "%$search%");
                )->orWhere('title', 'like', "%$search%" );
                )->paginate(10);

【讨论】:

这很有魅力!多谢,伙计。你能解释一下为什么顶部需要一个 where() 吗? 因为 orWhere() 会干扰同级别的其他条件。这就是我们将其移至另一个条件级别的原因。所以它只适用于 whereHas('categories') 条件.... 有道理,谢谢解释

以上是关于Laravel - whereHas 查询没有返回正确的记录的主要内容,如果未能解决你的问题,请参考以下文章

查询: 在邮递员的 whereHas 处返回,但表中有数据。拉拉维尔

Php 变量未传递到 whereHas 函数 - Laravel Eloquent

laravel Eloquent 查询 WhereHas 结果错误

优化 Laravel Eloquent whereHas() 查询 - 非常慢

从 Laravel 5.1 升级到 Laravel 5.8 后 whereHas() 变慢

Laravel 的 whereHas 表现不佳