Laravel eloquent - 通过连接多个列进行过滤

时间:2016-10-11 08:01:07

标签: php mysql laravel eloquent filtering

我是Laravel的新手,我在尝试执行以下操作时遇到困难。我有一个简单的用户表,其中包含以下列:

  • id
  • first_name
  • last_name

我即将制作一个带有过滤选项的用户列表。其中一个过滤器是full_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(['*']);

但它没有用。

规格:我正在使用最新的laravel。

3 个答案:

答案 0 :(得分:1)

我认为你在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'] . '%');

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

第二个使用连接值作为过滤器,然后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);