Laravel 连接得到名字 + 中间名 + 姓氏

Laravel Concat to get first name + middle name + last name

我正在尝试实现对数据表的搜索。现在,我只能搜索名字、中间名和姓氏等。但是,在搜索全名(中间名和姓氏)时,搜索将不起作用。 图片: success search for firtname/middle/last 图片2: not working when searching for fullname

在我的控制器中,我在一个函数中使用 DB::raw() concat。 这是我的代码:

$query->Where(function($query) use ($s)
    {
    $query->Where(DB::raw("CONCAT('first_name', ' ', 'middle_name')"), 'like', '%'.$s.'%')
    ->orwhere('first_name', 'ilike', '%'.$s.'%')
    ->orWhere('middle_name', 'ilike', '%'.$s.'%')
    ->orWhere('last_name', 'ilike', '%'.$s.'%')
    ->orWhere('email', 'ilike', '%'.$s.'%')
    ->orWhere('cellphone', 'ilike', '%'.$s.'%');
    });

请分享关于此的任何修复或见解。提前谢谢你。

请记住,用户可能会通过多种方式搜索姓名:

$query->Where(function($query) use ($s)
    {
    $query->where(DB::raw("CONCAT('first_name', ' ', 'middle_name')"), 'like', '%'.$s.'%')
    ->orWhere(DB::raw("CONCAT('first_name', ' ', 'last_name')"), 'like', '%'.$s.'%')
    ->orWhere(DB::raw("CONCAT('last_name', ', ', 'first_name')"), 'like', '%'.$s.'%')
    ->orWhere(DB::raw("CONCAT('first_name', ' ', 'middle_name', ' ', 'last_name')"), 'like', '%'.$s.'%')
    ->orWhere(DB::raw("CONCAT('last_name', ', ', 'first_name', ' ', 'middle_name')"), 'like', '%'.$s.'%')
    ->orwhere('first_name', 'ilike', '%'.$s.'%')
    ->orWhere('middle_name', 'ilike', '%'.$s.'%')
    ->orWhere('last_name', 'ilike', '%'.$s.'%')
    ->orWhere('email', 'ilike', '%'.$s.'%')
    ->orWhere('cellphone', 'ilike', '%'.$s.'%');
    });

您可以像这样使用 mysql 的 CONCAT_WS 功能,还有多种搜索方式,因此也包括在内:

$query->Where(function($query) use ($s)
{
    $query->orwhere('first_name', 'like', '%'.$s.'%')
    ->orWhere('middle_name', 'like', '%'.$s.'%')
    ->orWhere('last_name', 'like', '%'.$s.'%')
    ->orWhere('email', 'like', '%'.$s.'%')
    ->orWhere('cellphone', 'like', '%'.$s.'%')
    ->orWhereRaw('CONCAT_WS(" ", trim(FirstName), trim(LastName)) like "%' . $s . '%"');
});
User::where(function($query) use ($input) {
            $query->orWhere(DB::raw('CONCAT(first_name, " ", middle_name," ",last_name)'), 'LIKE', '%' . $input['search'] . '%')
                    ->orWhere('first_name', 'LIKE', "%{$input['search']}%")
                    ->orWhere('middle_name', 'LIKE', "%{$input['search']}%")
                    ->orWhere('middle_name', 'LIKE', "%{$input['search']}%")
                    ->orWhere('last_name', 'LIKE', "%{$input['search']}%")
                    ->orWhere('email', 'LIKE', "%{$input['search']}%")
                    ->orWhere('cellphone', 'LIKE', "%{$input['search']}%");
        });

希望对你有用。

试试这个:

 collect(explode($terms, ' '))->filter()->each(function ($term) use ($query) {
   $term = '%'.$term.'%';
   $query->where(function ($query) use ($term) {
     $query->where('first_name', 'like', $term)
           ->orWhere('last_name', 'like', $term)
           ->orWhere('..//whatever0', 'like', $term)
     });
   });

它不会使用任何索引,但这不是你的问题:-)

感谢您在这里提供的所有信息。我真的很感激。我实际上是 laravel 的新手 :) 祝你有美好的一天..

顺便说一下我的最终代码,也许有一天会有人来寻找答案。 full filter user controller

这对我有用:

$query->where(function ($query) use ($name) {
    $query->orWhereRaw('LOWER(first_name) like LOWER(?)', ["%{$name}%"])
        ->orWhereRaw('LOWER(middle_name) like LOWER(?)', ["%{$name}%"])
        ->orWhereRaw('LOWER(last_name) like LOWER(?)', ["%{$name}%"])
        ->orWhereRaw('LOWER(CONCAT(first_name, \' \', middle_name, \' \', last_name)) LIKE LOWER(?)', ["%{$name}%"]);
});