Как заставить laravel orwhere красноречиво работать только для некоторого пункта where?

$list = xxxxx->where('speakers.status', '1')->where('speakers.id_user', '!=', Auth::id());
        
if ($search != '' && $search != null) {
    $list = $list->where('topiks.topik', 'like', '%'.$search.'%')->orWhere('users.nama', 'like', '%'.$search.'%');
}

Как заставить orWhere('users.nama', 'like', '%'.$search.'%') работать только для where('topiks.topik', 'like', '%'.$search.'%') и не влиять на первое и второе где (where('speakers.status', '1') и where('speakers.id_user', '!=', Auth::id())?

Потому что, если код похож на приведенный выше, or where повлияет на первое и второе предложение where.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
641
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Где можно принять функцию обратного вызова. тогда вы можете сделать свою логику их. На основе Документации Laravel

$list = xxxxx->where('speakers.status', '1')
             ->where('speakers.id_user', '!=', Auth::id());
        
if ($search != '' && $search != null) {
    $list = $list->where(function($query) use ($search){
          $query->where('topiks.topik', 'like', '%'.$search.'%')
                ->orWhere('users.nama', 'like', '%'.$search.'%')
    });

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

Если вы получите результирующий SQL-запрос, это будет результат:

$list = DB::connection('mysql')->table('xxxxx')->where('speakers.status', '1')->where('speakers.id_user', '!=', 1);
$list = $list->where('topiks.topik', 'like', '%'.$search.'%')->orWhere('users.nama', 'like', '%'.$search.'%');

dump($list->toSql());

"select * from `xxxxx` where `speakers`.`status` = ? and `speakers`.`id_user`
 != ? and `topiks`.`topik` like ? or `users`.`nama` like ?"
SELECT * FROM `xxxxx`
WHERE `speakers`.`status` = ?
AND `speakers`.`id_user` != ?
AND `topiks`.`topik` LIKE ?
OR `users`.`nama` LIKE ?

Проблема заключается в отсутствии скобок (( )) в результирующем запросе. Необходимо логически сгруппировать. Требуемый запрос:

SELECT * FROM `xxxxx`
WHERE `speakers`.`status` = ?
AND `speakers`.`id_user` != ?
AND (
    `topiks`.`topik` LIKE ?
    OR `users`.`nama` LIKE ?
)

В документации по логической группировке есть очень наглядный пример того, чего вы хотите достичь.

Применение этого к вашему запросу приводит к следующему:

$list = xxxxx->where('speakers.status', '1')
             ->where('speakers.id_user', '!=', Auth::id());
        
if ($search != '' && $search != null) {
    $list = $list->where(function ($query) use ($search) {
        $query->where('topiks.topik', 'like', '%'.$search.'%')
              ->orWhere('users.nama', 'like', '%'.$search.'%');
    });
}

Это работает, но вы также можете превратить этот if оператор в условное предложение, следуя примеру из документации по условным предложениям

$list = xxxxx->where('speakers.status', '1')
             ->where('speakers.id_user', '!=', Auth::id())
             ->when(($search != '' && $search != null), function ($query) use ($search) {
                 $query = $query->where(function ($subquery) use ($search) {
                     $subquery->where('topiks.topik', 'like', '%'.$search.'%')
                              ->orWhere('users.nama', 'like', '%'.$search.'%');
                 });
             })

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