Это случай неправильного понимания приоритета, в языках && / AND
всегда будет вычисляться до || / OR
.Это означает, что, например, более короткая версия вашего запроса inspector_id == x AND maintenance_due_date >= Now() AND maintenance_due_date like %text%
ИЛИ maintenance_cost, например% text% can be true if only maintenance cost is like
text`.Поскольку оператор будет оцениваться следующим образом.
inspector_id == x AND maintenance_due_date >= Now() AND maintenance_due_date like %text%` OR maintenance_cost like %text%
преобразует равные операторы в его значения
false AND false AND false OR true
, поскольку AND имеет более высокий приоритет, и они оцениваются первыми.
false OR true
и, наконец, оценивается как true или в других случаях вы можете найти элементы, которые не связаны с конкретным инспектором, если некоторые из поисков верны.
Обернув логику поиска в подпункте where, вы получитерезультаты, которые вы хотите.
$data['reports'] = AssetMaintenance::with(['assets'])
->where('inspector_id',$tenant_inspector_id)
->where('maintenance_due_date','>=',Carbon::now()->startOfDay())
->whereHas('assets',function($query){
$query->active();//is_delete=0
})
//here is the extra where
->where(function($query){
$query->whereHas('assets',function($query) use($stext){
$query->where('asset_reference','like',"%{$stext}%")
->orWhere('asset_detail','like',"%{$stext}%");
})
->orWhereHas('assets.assetCategory',function($query) use($stext){
$query->where('assets_category.name','like',"%{$stext}%");
})
->orWhere('maintenance_due_date','like',"%{$stext}%")
->orWhere('maintenance_cost','like',"%{$stext}%")
->orderBy('maintenance_due_date','ASC');
})
->paginate(10);
Теперь это обернет результаты поиска, относящиеся к операторам, так что там будет правильный приоритет, опять короткий пример: inspector_id == x AND (maintenance_due_date like %text% OR maintenance_cost like %text%)