$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.
Где можно принять функцию обратного вызова. тогда вы можете сделать свою логику их. На основе Документации 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.'%');
});
})