首页 > 解决方案 > 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.'%');
}

标签: phpmysqllaraveleloquent

解决方案


如果他们使用 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
}

推荐阅读