2016-10-11 65 views
1

我是Laravel的新手,我试图执行以下操作。我有以下的列一个简单的用户表: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。

+0

什么是不正确的工作?你有错误吗?阅读laravel中的调试查询:https://scotch.io/tutorials/debugging-queries-in-laravel – haakym

回答

0

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

第二个用于连接的值作为过滤器,则Laravels分页会尝试通过使用该连接的值来计算总体结果计数。当然它不存在。解决办法是:

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

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'] . '%'); 
+0

是的。我意识到这太晚了。我忘了'%'通配符... –

+0

如果我用paginate'$ query-> paginate(10,['*'],'page',1)'使用它,我得到以下错误:“Column not found :1054'having clause'中的未知列'full_name'(SQL:select count(*)as'users'中的集合,其中'deleted_at'为空,'users'.'leleted_at'为null,具有'full_name' LIKE ad% 它试图计算整体结果...任何解决方案? –

+0

@Olaszka我认为这个错误是明确的,它不知道'full_name'是什么,我认为你忘了'... as full_name'。否则用新问题更新问题。 –