返回

Laravel orWhereHas() 忽略 where() 条件?彻底解决!

php

Laravel 中 orWhereHas() 忽略 where() 条件:解决方案

问题

在 Laravel 中使用 orWhereHas() 方法时,它可能会忽略 where() 条件块中的约束。这可能会导致过滤结果时出现意外情况。

解决方法

解决此问题的最佳方法是使用 whereExists() 子查询。它允许你基于关联模型的条件过滤主模型。例如:

$q = $request->query('q');

$faktur = FakturKonsinyasi::with(['indukbuku', 'distributor'])
  ->where('qty', '<>', 0)
  ->where('id_faktur_konsinyasi', 'like', '%' . $q . '%')
  ->where('id_faktur_konsinyasi', 'like', 'FKTKNST%')
  ->orderBy('id_faktur_konsinyasi', 'ASC');

if(!str_contains($q,'FKTKNST') && !empty($q)) {
  $faktur = $faktur->whereExists(function ($query) use ($q) {
    $query->select('id_faktur_konsinyasi')
          ->from('indukbukus')
          ->where('id_faktur_konsinyasi', 'like', '%' . $q . '%');
  })->orWhereExists(function ($query) use ($q) {
    $query->select('id_faktur_konsinyasi')
          ->from('distributors')
          ->where('id_faktur_konsinyasi', 'like', '%' . $q . '%');
  });
}

$faktur = $faktur->paginate(10);

结论

使用 whereExists() 子查询可以确保 where() 条件块中的所有约束都得到考虑,即使使用了 orWhereHas() 方法。这提供了对结果进行更灵活和全面的过滤。

常见问题解答

  1. 为什么 orWhereHas() 会忽略 where() 条件?

    • orWhereHas() 使用关联模型的查询,该查询可能具有自己的约束,这可能导致 where() 条件被覆盖。
  2. whereExists() 子查询是如何工作的?

    • 它检查关联模型的表中是否存在与给定条件匹配的记录。如果存在,则主查询将返回满足该条件的模型。
  3. 什么时候应该使用 whereExists() 子查询?

    • 当你需要基于关联模型的条件过滤主模型时,比如本文所讨论的情况。
  4. 除了 whereExists(),还有其他解决此问题的选项吗?

    • 另一种选择是使用 join 语句显式地连接表并应用条件。
  5. 此解决方法仅适用于 Laravel 吗?

    • 不,此解决方法可以适用于其他使用 Eloquent ORM 的 PHP 框架。