如何在Eloquent查询中实现拼接字段去空格并用作条件筛选?
当然可以搞定!下面给你几种实用的方案,根据你的数据库类型和需求来选:
解决方案
1. 数据库层面直接拼接过滤(推荐,效率更高)
这种方式直接在SQL查询里完成拼接、去空格和匹配,避免把全表数据拉到PHP层面处理,效率更高。
针对MySQL/MariaDB
利用CONCAT拼接字段,REPLACE去掉所有空格,同时处理insertion可能为NULL的情况(避免拼接结果变成NULL):
$searchTerm = 'HeinzvonWalsmit'; // 你的$query变量 $results = DB::table('table') ->select( 'first_name', 'insertion', 'last_name', // 生成去除空格后的name字段 DB::raw("REPLACE(CONCAT(first_name, COALESCE(insertion, ''), last_name), ' ', '') AS name") ) // 用同样的表达式匹配搜索词 ->whereRaw("REPLACE(CONCAT(first_name, COALESCE(insertion, ''), last_name), ' ', '') = ?", [$searchTerm]) ->get();
针对PostgreSQL
PostgreSQL可以用REGEXP_REPLACE来更灵活地去除所有空白字符(包括空格、制表符等),如果只需要去空格也可以用REPLACE:
$searchTerm = 'HeinzvonWalsmit'; $results = DB::table('table') ->select( 'first_name', 'insertion', 'last_name', DB::raw("REGEXP_REPLACE(CONCAT(first_name, COALESCE(insertion, ''), last_name), '\\s+', '', 'g') AS name") ) ->whereRaw("REGEXP_REPLACE(CONCAT(first_name, COALESCE(insertion, ''), last_name), '\\s+', '', 'g') = ?", [$searchTerm]) ->get();
2. 模型访问器(仅用于查询后显示,不适合过滤)
如果你只是想在查询结果中得到处理后的name字段,但不需要用它做数据库层面的过滤,可以在模型中定义访问器:
// 在你的模型类中 public function getNameAttribute() { // 拼接并去除所有空格 return str_replace(' ', '', $this->first_name . ($this->insertion ?? '') . $this->last_name); }
然后查询的时候直接获取:
// 注意:这种方式无法用name字段做WHERE过滤,因为是PHP层面处理的 $results = YourModel::select('first_name', 'insertion', 'last_name')->get(); // 每个结果对象都会自动有name属性 foreach ($results as $item) { echo $item->name; // 输出如HeinzvonWalsmit }
提示:如果需要频繁用这个拼接后的字段做查询,建议在数据库中新增一个计算列(或者触发器更新的字段),这样可以直接对该字段建索引,大幅提升查询效率。
内容的提问来源于stack exchange,提问作者Justin Boxem
相关产品推荐
相关产品推荐

