我是laravel查询生成器的新手,我想搜索在输入字段中输入的多个单词,例如,如果我键入“jhon doe”,我想获取任何包含jhon或doe的列

我已经看到/尝试过使用php MySQL解决方案,但无法适应查询生成器

//1. exploding the space between the keywords

//2. using foreach apend the query together

$query = "select * from users where";

$keywordRaw = "jhon doe";
$keywords = explode(' ', $keywordRaw );
foreach ($keywords as $keyword){
$query.= " first_name LIKE '%" + $keyword +"%' OR ";
}

如何使用查询生成器执行此操作

这是我到目前为止所拥有的,执行此操作的正确方法是什么,
$keywordRaw = "jhon doe";
//how do I explode this words and append them along with their appropriate query
$users = User::select('users.*')
->where('first_name', 'LIKE', '%'.$keywordRaw.'%')

请帮助,在此先感谢

最佳答案

这是使用Query\Builder的方法,但是首先要注意一些其他事项:

// 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 ...

也就是说,您显然不能依赖explode,因为在上述情况下,您将获得所有行。

因此,这是您应该做的:
$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();
where中有闭包,因为将or where子句括在括号中是一种好习惯。例如,如果您的User模型使用了SoftDeletingScope,而您却没有按照我的建议去做,那么整个查询就会被弄乱。

关于php - laravel搜索由空格分隔的多个单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28270244/

10-11 08:40