Reputation: 1231
This is a shortened version of model query:
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);
}
}
});
(In case you are wondering, I am using $key === array_key_first
to ensure the first BETWEEN
uses AND
, and afterwards uses OR
depending on the user's selections)
This equates to the following SQL query:
SELECT
`users`.*
FROM
`users`
WHERE
`country_id` = '31'
AND `engagement_rate` BETWEEN '6' AND '20' OR `engagement_rate` BETWEEN '3.5' AND '6'
The whereBetween
in Eloquent does not include brackets, and as such the country_id selector gets ignored. I need the final SQL statement to be the below (with brackets):
SELECT
`users`.*
FROM
`users`
WHERE
`country_id` = '31'
AND (`engagement_rate` BETWEEN '6' AND '20' OR `engagement_rate` BETWEEN '3.5' AND '6')
My question:
How can I change my Eloquent query to reflect the above?
Upvotes: 1
Views: 325
Reputation: 5098
Add a parameter group to the whereBetween
and orWhereBetween
clauses:
User::select('users.*')
// ...
->when(!empty($this->searchInput['engagement']), function ($query) {
query->where(function ($q) {
foreach ($this->searchInput['engagement'] as $key => $value) {
if ($key === array_key_first($this->searchInput['engagement'])) {
$q->whereBetween('engagement_rate', $value);
} else {
$q->orWhereBetween('engagement_rate', $value);
}
}
});
});
Upvotes: 1