【问题标题】:Laravel eloquent - filter by concatenation of multiple columnsLaravel eloquent - 通过连接多列进行过滤
【发布时间】:2017-02-19 17:34:48
【问题描述】:

我是 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。

【问题讨论】:

标签: php mysql laravel eloquent filtering


【解决方案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'] . '%');

【讨论】:

  • 如果我将它与 paginate $query->paginate(10, ['*'], 'page', 1) 一起使用,我收到以下错误:“未找到列:1054 Unknown column 'full_name' in 'have Clause' (SQL: select count(*) as aggregate来自users,其中deleted_at 为null,users.deleted_at 为null,具有full_name LIKE ad%”。它试图计算总体结果...对此有什么解决方案吗?
  • @Olaszka 我认为错误很明显。它不知道full_name 是什么。我想你忘记了... as full_name 之类的东西。否则用新问题更新问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    第二个使用连接值作为过滤器,然后 Laravel 分页尝试使用该连接值计算总结果数。当然不存在。解决办法是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-12
      • 2014-01-15
      • 2021-12-03
      • 2020-04-18
      • 1970-01-01
      • 2021-02-24
      • 2014-07-19
      • 1970-01-01
      相关资源
      最近更新 更多