Laravel 连接得到名字 + 中间名 + 姓氏
Laravel Concat to get first name + middle name + last name
我正在尝试实现对数据表的搜索。现在,我只能搜索名字、中间名和姓氏等。但是,在搜索全名(中间名和姓氏)时,搜索将不起作用。
图片:
success search for firtname/middle/last
图片2:
not working when searching for fullname
在我的控制器中,我在一个函数中使用 DB::raw()
concat。
这是我的代码:
$query->Where(function($query) use ($s)
{
$query->Where(DB::raw("CONCAT('first_name', ' ', 'middle_name')"), 'like', '%'.$s.'%')
->orwhere('first_name', 'ilike', '%'.$s.'%')
->orWhere('middle_name', 'ilike', '%'.$s.'%')
->orWhere('last_name', 'ilike', '%'.$s.'%')
->orWhere('email', 'ilike', '%'.$s.'%')
->orWhere('cellphone', 'ilike', '%'.$s.'%');
});
请分享关于此的任何修复或见解。提前谢谢你。
请记住,用户可能会通过多种方式搜索姓名:
$query->Where(function($query) use ($s)
{
$query->where(DB::raw("CONCAT('first_name', ' ', 'middle_name')"), 'like', '%'.$s.'%')
->orWhere(DB::raw("CONCAT('first_name', ' ', 'last_name')"), 'like', '%'.$s.'%')
->orWhere(DB::raw("CONCAT('last_name', ', ', 'first_name')"), 'like', '%'.$s.'%')
->orWhere(DB::raw("CONCAT('first_name', ' ', 'middle_name', ' ', 'last_name')"), 'like', '%'.$s.'%')
->orWhere(DB::raw("CONCAT('last_name', ', ', 'first_name', ' ', 'middle_name')"), 'like', '%'.$s.'%')
->orwhere('first_name', 'ilike', '%'.$s.'%')
->orWhere('middle_name', 'ilike', '%'.$s.'%')
->orWhere('last_name', 'ilike', '%'.$s.'%')
->orWhere('email', 'ilike', '%'.$s.'%')
->orWhere('cellphone', 'ilike', '%'.$s.'%');
});
您可以像这样使用 mysql 的 CONCAT_WS 功能,还有多种搜索方式,因此也包括在内:
$query->Where(function($query) use ($s)
{
$query->orwhere('first_name', 'like', '%'.$s.'%')
->orWhere('middle_name', 'like', '%'.$s.'%')
->orWhere('last_name', 'like', '%'.$s.'%')
->orWhere('email', 'like', '%'.$s.'%')
->orWhere('cellphone', 'like', '%'.$s.'%')
->orWhereRaw('CONCAT_WS(" ", trim(FirstName), trim(LastName)) like "%' . $s . '%"');
});
User::where(function($query) use ($input) {
$query->orWhere(DB::raw('CONCAT(first_name, " ", middle_name," ",last_name)'), 'LIKE', '%' . $input['search'] . '%')
->orWhere('first_name', 'LIKE', "%{$input['search']}%")
->orWhere('middle_name', 'LIKE', "%{$input['search']}%")
->orWhere('middle_name', 'LIKE', "%{$input['search']}%")
->orWhere('last_name', 'LIKE', "%{$input['search']}%")
->orWhere('email', 'LIKE', "%{$input['search']}%")
->orWhere('cellphone', 'LIKE', "%{$input['search']}%");
});
希望对你有用。
试试这个:
collect(explode($terms, ' '))->filter()->each(function ($term) use ($query) {
$term = '%'.$term.'%';
$query->where(function ($query) use ($term) {
$query->where('first_name', 'like', $term)
->orWhere('last_name', 'like', $term)
->orWhere('..//whatever0', 'like', $term)
});
});
它不会使用任何索引,但这不是你的问题:-)
感谢您在这里提供的所有信息。我真的很感激。我实际上是 laravel 的新手 :)
祝你有美好的一天..
顺便说一下我的最终代码,也许有一天会有人来寻找答案。
full filter user controller
这对我有用:
$query->where(function ($query) use ($name) {
$query->orWhereRaw('LOWER(first_name) like LOWER(?)', ["%{$name}%"])
->orWhereRaw('LOWER(middle_name) like LOWER(?)', ["%{$name}%"])
->orWhereRaw('LOWER(last_name) like LOWER(?)', ["%{$name}%"])
->orWhereRaw('LOWER(CONCAT(first_name, \' \', middle_name, \' \', last_name)) LIKE LOWER(?)', ["%{$name}%"]);
});
我正在尝试实现对数据表的搜索。现在,我只能搜索名字、中间名和姓氏等。但是,在搜索全名(中间名和姓氏)时,搜索将不起作用。 图片: success search for firtname/middle/last 图片2: not working when searching for fullname
在我的控制器中,我在一个函数中使用 DB::raw()
concat。
这是我的代码:
$query->Where(function($query) use ($s)
{
$query->Where(DB::raw("CONCAT('first_name', ' ', 'middle_name')"), 'like', '%'.$s.'%')
->orwhere('first_name', 'ilike', '%'.$s.'%')
->orWhere('middle_name', 'ilike', '%'.$s.'%')
->orWhere('last_name', 'ilike', '%'.$s.'%')
->orWhere('email', 'ilike', '%'.$s.'%')
->orWhere('cellphone', 'ilike', '%'.$s.'%');
});
请分享关于此的任何修复或见解。提前谢谢你。
请记住,用户可能会通过多种方式搜索姓名:
$query->Where(function($query) use ($s)
{
$query->where(DB::raw("CONCAT('first_name', ' ', 'middle_name')"), 'like', '%'.$s.'%')
->orWhere(DB::raw("CONCAT('first_name', ' ', 'last_name')"), 'like', '%'.$s.'%')
->orWhere(DB::raw("CONCAT('last_name', ', ', 'first_name')"), 'like', '%'.$s.'%')
->orWhere(DB::raw("CONCAT('first_name', ' ', 'middle_name', ' ', 'last_name')"), 'like', '%'.$s.'%')
->orWhere(DB::raw("CONCAT('last_name', ', ', 'first_name', ' ', 'middle_name')"), 'like', '%'.$s.'%')
->orwhere('first_name', 'ilike', '%'.$s.'%')
->orWhere('middle_name', 'ilike', '%'.$s.'%')
->orWhere('last_name', 'ilike', '%'.$s.'%')
->orWhere('email', 'ilike', '%'.$s.'%')
->orWhere('cellphone', 'ilike', '%'.$s.'%');
});
您可以像这样使用 mysql 的 CONCAT_WS 功能,还有多种搜索方式,因此也包括在内:
$query->Where(function($query) use ($s)
{
$query->orwhere('first_name', 'like', '%'.$s.'%')
->orWhere('middle_name', 'like', '%'.$s.'%')
->orWhere('last_name', 'like', '%'.$s.'%')
->orWhere('email', 'like', '%'.$s.'%')
->orWhere('cellphone', 'like', '%'.$s.'%')
->orWhereRaw('CONCAT_WS(" ", trim(FirstName), trim(LastName)) like "%' . $s . '%"');
});
User::where(function($query) use ($input) {
$query->orWhere(DB::raw('CONCAT(first_name, " ", middle_name," ",last_name)'), 'LIKE', '%' . $input['search'] . '%')
->orWhere('first_name', 'LIKE', "%{$input['search']}%")
->orWhere('middle_name', 'LIKE', "%{$input['search']}%")
->orWhere('middle_name', 'LIKE', "%{$input['search']}%")
->orWhere('last_name', 'LIKE', "%{$input['search']}%")
->orWhere('email', 'LIKE', "%{$input['search']}%")
->orWhere('cellphone', 'LIKE', "%{$input['search']}%");
});
希望对你有用。
试试这个:
collect(explode($terms, ' '))->filter()->each(function ($term) use ($query) {
$term = '%'.$term.'%';
$query->where(function ($query) use ($term) {
$query->where('first_name', 'like', $term)
->orWhere('last_name', 'like', $term)
->orWhere('..//whatever0', 'like', $term)
});
});
它不会使用任何索引,但这不是你的问题:-)
感谢您在这里提供的所有信息。我真的很感激。我实际上是 laravel 的新手 :) 祝你有美好的一天..
顺便说一下我的最终代码,也许有一天会有人来寻找答案。 full filter user controller
这对我有用:
$query->where(function ($query) use ($name) {
$query->orWhereRaw('LOWER(first_name) like LOWER(?)', ["%{$name}%"])
->orWhereRaw('LOWER(middle_name) like LOWER(?)', ["%{$name}%"])
->orWhereRaw('LOWER(last_name) like LOWER(?)', ["%{$name}%"])
->orWhereRaw('LOWER(CONCAT(first_name, \' \', middle_name, \' \', last_name)) LIKE LOWER(?)', ["%{$name}%"]);
});