Это сокращенная версия модельного запроса:
User::select('users.*')
->when(!empty($this->searchInput['search[term]']), function ($query) {
return $query->where(
'biography', 'LIKE', '%' . $this->searchInput['search[term]'] . '%'
);
})
->when(!empty($this->searchInput['search[location]']), function ($query) {
return $query->where(
'country_id',
$this->searchInput['search[location]']
);
})
->when(!empty($this->searchInput['engagement']), function ($query) {
foreach ($this->searchInput['engagement'] as $key => $value) {
if ($key === array_key_first($this->searchInput['engagement'])) {
$query->whereBetween('engagement_rate', $value);
} else {
$query->orWhereBetween('engagement_rate', $value);
}
}
});
(Если вам интересно, я использую $key === array_key_first
, чтобы убедиться, что первый BETWEEN
использует AND
, а затем использует OR
в зависимости от выбора пользователя)
Это соответствует следующему запросу SQL:
SELECT
`users`.*
FROM
`users`
WHERE
`country_id` = '31'
AND `engagement_rate` BETWEEN '6' AND '20' OR `engagement_rate` BETWEEN '3.5' AND '6'
whereBetween
в Eloquent не включает скобки, и поэтому селектор country_id игнорируется. Мне нужно, чтобы последняя инструкция SQL была приведена ниже (в скобках):
SELECT
`users`.*
FROM
`users`
WHERE
`country_id` = '31'
AND (`engagement_rate` BETWEEN '6' AND '20' OR `engagement_rate` BETWEEN '3.5' AND '6')
Мой вопрос:
Как я могу изменить свой запрос Eloquent, чтобы отразить над?