【问题标题】:Laravel Concat to get first name + middle name + last nameLaravel Concat 获取名字+中间名+姓氏
【发布时间】:2021-08-18 12:04:11
【问题描述】:

我正在尝试实现对数据表的搜索。现在,我只能搜索名字、中间名和姓氏等。但是,在搜索全名(名字中间名和姓氏)时,搜索将不起作用。 图片: 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.'%');
    });

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

【问题讨论】:

标签: php laravel datatables laravel-query-builder


【解决方案1】:
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']}%");
        });

我希望它对你有用。

【讨论】:

  • 您的回答在这里起到了神奇的作用。 other 提供的其他示例也有效。但我会去这个。再次感谢。
  • 很高兴为您提供帮助 :) 如果您愿意,请将此答案标记为正确。
【解决方案2】:

感谢您在此提供的所有意见。对此,我真的非常感激。我实际上是 laravel 的新手 :) 祝你有美好的一天..

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

【讨论】:

    【解决方案3】:

    你可以像这样使用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 . '%"');
    });
    

    【讨论】:

    • 谢谢你和 Ankita 的回答一样有效:)
    【解决方案4】:

    试试这个:

     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)
         });
       });
    

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

    【讨论】:

    • 谢谢 :) 我使用了其他解决方案,但我尝试了这个并且它有效。我最好也把它收藏起来。感谢大家的投入
    • 支持,所以当你有声望时,它也会给分 :-)
    【解决方案5】:

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

    $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.'%');
        });
    

    【讨论】:

    • 一开始的查询参数,报错。我确实删除了那部分并且它起作用了。谢谢
    • 哦,抱歉,我太笨了,无法复制粘贴:D 已修复。
    【解决方案6】:

    这对我有用:

    $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}%"]);
    });
    

    【讨论】:

      猜你喜欢
      • 2016-02-22
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      相关资源
      最近更新 更多