【问题标题】:Laravel concat query return 0 itemsLaravel concat 查询返回 0 个项目
【发布时间】:2021-07-04 01:42:40
【问题描述】:

这是我的控制器代码:

if ($request->exists('tipo')) {
    $valor = $request->value;
    $candidates = Candidate::buscarpor($tipo, $valor)
                           ->orderBy('id', 'desc')
                           ->Paginate(5)
                           ->withQueryString();
    dd($candidates);
}

这是我的“候选”模型中的“buscarpor”范围:

public function scopeBuscarpor($query, $tipo, $valor)
{
    if(($tipo) && ($valor)) {
        if($tipo == 'names') {
            // return $query->orWhereRaw("concat(name, ' ', last_name) like '%".$valor."%' ");
            return $query->where(DB::raw("CONCAT('name', ' ', 'last_name')"), 'like', '%'.$valor.'%')
                         ->orWhere(DB::raw("CONCAT('last_name', ' ', 'name')"), 'like', '%'.$valor.'%');
        }
            
        return $query->where($tipo, 'like', "%$valor%");
    }
}

当搜索类型为“名称”时,我应该在数据库中查询以使用他的名字或姓氏搜索候选人/人,我只有一个输入类型文本,我只是写下他的所有名字就是这个输入输入文字。

这个范围内的变量 $valor 有数据并且没有问题。我测试了添加一个存在于我的数据库中的名称,但它返回 0 个项目。

这是我的dd($candidates) 输出。

我不知道我做错了什么,如果您对如何解决此问题有一些想法,请大家帮忙,我将不胜感激。非常感谢。

【问题讨论】:

    标签: database laravel eloquent


    【解决方案1】:

    也许 where 表达式的格式不正确。试试这样写

    $query->where(DB::raw("CONCAT('name', ' ', 'last_name') like '%?%'", [$valor]))
          ->orWhere(DB::raw("CONCAT('last_name', ' ', 'name') like '%?%'", [$valor]));
    

    您也可以改用whereRaw() 语法

    $query->whereRaw("CONCAT('name', ' ', 'last_name') like '%?%'", [$valor])
          ->orWhereRaw("CONCAT('last_name', ' ', 'name') like '%?%'", [$valor]);
    

    或者数据库中的名字是用大写字母写的?如果您使用的是 postgreSQL,则可以使用 ilike 而不是 like 进行不区分大小写的搜索。

    如果您使用的是 MySQL,您可能必须在原始方法中使用 lower()

    $query->whereRaw("LOWER(CONCAT('name', ' ', 'last_name')) like '%?%'", [$valor])
          ->orWhereRaw("LOWER(CONCAT('last_name', ' ', 'name')) like '%?%'", [$valor]);
    

    【讨论】:

    • 非常感谢兄弟.. 但我也无法得到结果.. 查询不返回任何结果。这是我的 bd imgur.com/a/jzni14V 的一个选择,我也在使用 softdeletes.. 但该查询应该返回所有结果.. 我测试了 ->whereNull('deleted_at');但什么也没发生。
    • 你在用mysql吗?
    • 一种可能性是用通配符替换搜索字符串中的每个空格。 ($valor = str_replace(' ', '%', $valor);)。
    • 最后我们解决了这个问题:return $query->where(function ($q) use ($valor) { $q->whereRaw("lower(concat(name, ' ', last_name)) like '%$valor%'") ->orWhereRaw("lower(concat(last_name, ' ', name)) like '%$valor%'"); }); 非常感谢兄弟..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2015-11-01
    • 1970-01-01
    相关资源
    最近更新 更多