Добавление скобок в запрос BETWEEN в Laravel? - PullRequest
1 голос
/ 29 мая 2020

Это сокращенная версия модельного запроса:

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, чтобы отразить над?

1 Ответ

1 голос
/ 29 мая 2020

Добавьте группу параметров в предложения whereBetween и orWhereBetween:

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);
            }
        }
    });

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...