返回
Laravel orWhereHas() 忽略 where() 条件?彻底解决!
php
2024-03-10 05:20:04
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()
方法。这提供了对结果进行更灵活和全面的过滤。
常见问题解答
-
为什么
orWhereHas()
会忽略where()
条件?orWhereHas()
使用关联模型的查询,该查询可能具有自己的约束,这可能导致where()
条件被覆盖。
-
whereExists()
子查询是如何工作的?- 它检查关联模型的表中是否存在与给定条件匹配的记录。如果存在,则主查询将返回满足该条件的模型。
-
什么时候应该使用
whereExists()
子查询?- 当你需要基于关联模型的条件过滤主模型时,比如本文所讨论的情况。
-
除了
whereExists()
,还有其他解决此问题的选项吗?- 另一种选择是使用 join 语句显式地连接表并应用条件。
-
此解决方法仅适用于 Laravel 吗?
- 不,此解决方法可以适用于其他使用 Eloquent ORM 的 PHP 框架。