Использование when с whereHas в Laravel

У меня такой запрос:

return Expense::with('descriptions')
    ->when($this->string, function ($query) {
        return $query->where('name', 'LIKE', '%' . $this->string . '%');
    })
    ->orWhereHas('tags', function ($query) {
        $query->where('name', 'LIKE', '%' . $this->string . '%');
    })
    ->get();

Мне нужно как-то использовать whereHas с when. Если $this->string пуст, whereHas использовать нельзя. Поскольку он вернет все, что имеет такой Tag, и мне нужно запускать его только тогда, когда $this->string не пуст.

Есть ли способ написать это чисто? Я не хочу использовать if / else для проверки, установлен ли $this->string, а затем возвращать что-то другое.

Разве нельзя просто переместить orWhereHas() в крышку when()?

Jonas Staudenmeir 17.12.2018 21:56

Похоже, здесь имеет смысл оператор if или какое-то условие. Почему ты не хочешь этого делать? Вы пробовали вложить orWhereHas в оператор when? В этом случае вам просто нужно быть осторожным, чтобы содержать переменные $ query в порядке.

eResourcesInc 17.12.2018 21:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
361
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку ваш где зависит от внешней переменной, лучший подход - построить ваш запрос с условными операторами, оценивающими ваши переменные.

Не бойтесь разбить построение вашего запроса на несколько этапов, вам не нужно все связывать и возвращать.

Более читабельно выглядит что-то вроде этого:

$builder = Expense::with('descriptions')
                ->where('name', 'LIKE', '%' . $this->string . '%');

if ($this->string) {
    $builder = $builder->whereHas('tags', function ($query) {
        $query->where('name', 'LIKE', '%' . $this->string . '%');
    });
}
return $builder->get();

Принял этот ответ, так как он действительно выглядит более чистым. Однако в моем случае пришлось перейти на $builder = $builder->orWhereHas.

Hardist 19.12.2018 09:18

Вы хотите что-то подобное?

return Expense::with('descriptions')
    ->when(!empty($this->string), function ($query) {
        return $query->WhereHas('tags', function ($query) {
            $query->where('name', 'LIKE', '%' . $this->string . '%');
        })
    })
    ->get();

Другие вопросы по теме