laravel 如何在Eloquent模型中实现搜索不区分大小写

k5ifujac  于 2023-01-18  发布在  其他
关注(0)|答案(9)|浏览(250)

我想在Eloquent模型中搜索不区分大小写。
现在我用这个

Model::where($column, 'LIKE', '%' . $value . '%' );

但它是区分大小写的,我怎么才能解决这个问题呢?
我也发现这篇文章How can I search (case-insensitive) in a column using LIKE wildcard?,但我不能在雄辩模型中使用它

oogrdqng

oogrdqng1#

实际上,您不需要使用UPPER,只需使用ilike作为比较器,它将执行大小写不敏感的比较。

Model::where('column', 'ilike', '%' . $value . '%')

您 * 确实 * 需要%符号来表示您要搜索的子字符串。

ars1skjm

ars1skjm2#

在这种情况下我建议使用Upper函数

Model::whereRaw("UPPER('{$column}') LIKE '%'". strtoupper($value)."'%'");

像这样

omhiaaxx

omhiaaxx3#

没有看到这个解决方案。所以我把它贴在这里。

DB::table('products')
   ->select('productid')                
   ->where(DB::raw('lower(product)'), 'like', '%' . strtolower($searchword) . '%')
   ->get();
6ju8rftf

6ju8rftf4#

这应该行得通。
更换column$text

$model = Models::whereRaw( 'LOWER(`column`) LIKE ?', [ $text ] )->first();
jutyujz0

jutyujz05#

laravel雄辩的搜索是大小写不敏感的,你不需要像,在您的查询上或下函数。
只需使用:

Model::query()
    ->where('column1_name', 'LIKE', "%{$search}%") 
    ->orWhere('column2_name', 'LIKE', "%{$search}%") 
    ->orWhere('column3_name', 'LIKE', "%{$search}%") 
    ->get();

orWhere部分是在您有多个表字段要查询时使用的

nkkqxpd9

nkkqxpd96#

你的表格是怎么排列的?
这是数据库中归类的特殊性,请尝试使用latin_general_cilatin_gerneral_cs,它们不区分大小写。
但是,如果您尝试通过示例在utf8_bin中获取此排序规则,则它不会运行,因为此排序规则是敏感的。
所有示例都在MySql下运行。

23c0lvtd

23c0lvtd7#

您不必将关键字和DB值都转换为相同的大小写(UPPER或LOWER)。您只需指定“iLIKE”而不是“LIKE”。以下示例根据category_id返回模型数据列表,关键字与名字或姓氏是否匹配至关重要:

$transactions = Transaction::where('category_id', $category_id);
$transactions = $transactions->where(function ($q) use($keyword) {               
    $q->where('firstName', 'iLIKE', '%'.$keyword.'%');
    $q->orwhere('lastName', 'LIKE', '%'.$keyword.'%');
});
rn0zuynd

rn0zuynd8#

最佳选择是使用BINARY

User::select("id", "name", "email")
                    ->where(DB::raw('BINARY `name`'), "Daniel")
                    ->get();
zfciruhq

zfciruhq9#

已回答,请使用iLike运算符,它不区分大小写,请参见

Laravel Eloquent Ignore Casing
或者为了好玩这样做,不推荐。

// prepare two variants of the same value ?
// first to uppercase
// second to lowercase

$valueUp    = strtoupper($value);
$valueLower = strtolower($value);

Model::where($column, 'LIKE', '%' . ($valueUp || $valueLower) . '%' );

没有测试它,但这就是获胜的想法。

相关问题