代码之家  ›  专栏  ›  技术社区  ›  Zoltán Fekete

Laravel eloquent-通过多列串联进行过滤

  •  2
  • Zoltán Fekete  · 技术社区  · 8 年前

    我是新来的拉雷维尔,我被困在试图执行以下。我有一个简单的用户表,包含以下列:

    • id
    • first_name
    • last_name

    full_name ,但我不储存 全名 的用户,我不能修改表结构。

    几天来,我做到了:

    $query = \DB::table('users');
    $query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
            as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']);
    $result = $query->get(['*']);
    

    但它不起作用。

    规格

    3 回复  |  直到 8 年前
        1
  •  1
  •   Lars Mertens    8 年前

    我想你忘记了LIKE语句中的通配符。

    取而代之的是

    $query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
        as `full_name`, id'))->having('full_name', 'LIKE',$input['filter_name']);
    

    尝试:

    $query->select(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`) 
        as `full_name`, id'))->having('full_name', 'LIKE', '%' . $input['filter_name'] . '%');
    
        2
  •  0
  •   ToNy    8 年前

    也许,与其尝试通过修改查询来实现它,不如像正常一样获取查询: $users = DB::table('users')->get(); 然后,使用 collections . ->filter(function($key, $value) { return strpos($value['first_name'].' '.$value['last_name'], $to_find) !== false })->all();

        3
  •  0
  •   Zoltán Fekete    8 年前

    我解决了。第一个问题是,我忘记了“%”通配符。

    第二种方法使用串联值作为过滤器,然后Laravels paginate尝试使用该串联值来计算整个结果计数。确定它不存在。解决方案是:

    $query = \App\User::whereDeletedAt(null);
    $query->where(\DB::raw('CONCAT_WS(" ", `last_name`, `first_name`)'), 'like', '%' . $input['filter_name'] . '%');
    $query->paginate(15, ['*'], 'page', 1);