php - WHERE LIKE 在 Eloquent 中搜索带和不带空格
问题描述
我们在我们的网站上建立了一个搜索系统,并制作了一个品牌表。有些品牌的名称中有空格,有些则没有。
例如,我们有
《龟蜡》
我想做的是,当用户搜索说Turtlewax时,我的搜索会同时查找这两个版本......
- 龟蜡
- 龟蜡
这甚至可能吗?
我当前的代码如下...
$products = Product::select('product.*')
->join('brand', 'product.brand_id', '=', 'brand.id')
->join('child_product', 'product.id', '=', 'child_product.product_id')
->leftJoin('tax_rates', 'tax_rates.id', '=', 'child_product.tax_rate_id')
->with('brand', 'categories', 'childProducts', 'childProducts.attributeValues', 'images')
->where('product.active', true)
->where('brand.active', true)
->where(function ($query) use ($search_term)
{
$query->whereLike('product.name', $search_term)
->orWhereLike('product.description', $search_term)
->orWhere('brand.slug', str_slug($search_term, ''))
->orWhereLike('brand.slug', str_slug($search_term, '-'))
->orWhereLike('brand.name', str_replace(' ', '', $search_term))
->orWhere('brand.name', 'LIKE', '%'. $search_term);
})->get();
我为 WhereLike 和 orWhereLike 创建了 2 个查询范围
public function scopeWhereLike($query, $column, $value)
{
return $query->where($column, 'like', '%'.$value.'%');
}
public function scopeOrWhereLike($query, $column, $value)
{
return $query->orWhere($column, 'like', '%'.$value.'%');
}
解决方案
如果他们使用 PascalCase(“TurtleWax”),您可以执行以下操作:
public function scopeWhereLike($query, $column, $value)
{
return $query
->where($column, 'like', '%'.implode(' ', preg_split('/(?=[A-Z])/', $value)).'%') // "word/space case"
->orWhere($column, 'like', '%'.ucwords(strtolower($value)).'%') // Titlecase
->orWhere($column, 'like', '%'.$value.'%'); // PascalCase
->orWhere("REPLACE(".$column.", ' ', '')", 'like', '%'.$value.'%'); // fallback
}
推荐阅读
- javascript - 幻灯片按钮下划线和淡出动画
- .net - Vb.net DataGridView 超链接栏
- java - 散列与复合 PK 以确定它是否是具有唯一属性的对象(作为组合)
- cuda - cuda.mem_alloc 不分配内存
- respect-validation - 尊重验证 - 不使用 & 之一
- python - 使用 python kazoo 客户端的 Zookeeper 服务器健康检查/监控
- java - 在我的 GPA 计算器中需要输入两次
- android - 我想连接 Firebase,但出现错误
- arduino - arduino图形显示清晰显示不起作用
- java - TestNg Customized report: