Скорее всего, проблема в том, что вы неправильно инкапсулируете orWhere()
.Это даст запрос, который не очень очевиден и выполняет только функции из-за приоритета AND
над OR
.
. Таким образом, вам в основном нужно обернуть условные выражения district
/ city
вwhere(function ($query) { })
блок.Вместе с хорошим использованием when($condition, $callback)
это приводит к такому результату:
function searchRestaurant(Request $request)
{
$city = $request->input('city');
$district = $request->input('district');
$category = $request->input('category');
$fee = $request->input('fee');
$restaurants = Restaurant::query()
->when($district, function ($query, $bool) use ($district) {
$query->where(function (query) use ($district) {
$query->where('district_id', $district)
->orWhereHas('shipdistricts', function ($query) use ($district) {
$query->where('id', $district);
});
});
})
->when($city && !$district, function ($query, $bool) use ($city) {
$query->where('city_id', $city);
})
->when($category, function ($query, $bool) use ($category) {
$query->whereHas('categories', function ($query) use ($category) {
$query->where('id', $category);
});
})
->get();
return response()->json([
'success' => true,
'data' => $restaurants->toArray(),
]);
}
Вы не обязаны использовать unique()
для результата, так как в Restaurant
может быть только один экземплярв любом случае.