Đây là cách bạn thực hiện với Query\Builder
, nhưng trước tiên một số lưu ý bổ sung:
// user can provide double space by accident, or on purpose:
$string = 'john doe';
// so with explode you get this:
explode(' ', $string);
array(
0 => 'john',
1 => '',
2 => 'doe'
)
// Now if you go with LIKE '%'.value.'%', you get this:
select * from table where name like '%john%' or name like '%%' or ...
Điều đó nói rằng, bạn rõ ràng không thể dựa vào explode
bởi vì trong trường hợp trên, bạn sẽ nhận được tất cả các hàng.
Vì vậy, đây là những gì bạn nên làm:
$string = 'john doe';
// split on 1+ whitespace & ignore empty (eg. trailing space)
$searchValues = preg_split('/\s+/', $string, -1, PREG_SPLIT_NO_EMPTY);
$users = User::where(function ($q) use ($searchValues) {
foreach ($searchValues as $value) {
$q->orWhere('name', 'like', "%{$value}%");
}
})->get();
Có sự đóng cửa trong where
bởi vì nó là một thực tiễn tốt để bọc or where
mệnh đề trong ngoặc đơn. Ví dụ:nếu User
của bạn mô hình được sử dụng SoftDeletingScope
và bạn sẽ không làm những gì tôi đề xuất, toàn bộ truy vấn của bạn sẽ rối tung lên.