在我的Web应用程序中,我有位置,每个位置都有company_id
,并且我不想在同一家公司中使用相同的位置名称。所以我做到了:
$name = $request->get('name');
$location = Location::find($id);
if ($location->name != $name) {
$old_location = Location::where('company_id', $location->company_id)
->where('name', $name)
->first();
if ($old_location) {
$errors = ['name' => trans('asset.location').' '.$name.'
'.trans('message.already_exists')];
return back()->withErrors($errors)->withInput();
}
}
问题是,如果我拥有Service
的位置并想将其名称更改为Šervice
,它将不允许我这样做。我没有这样命名的位置。如果条件通过但雄辩的搜索失败。这怎么可能?
答案 0 :(得分:2)
确保已在配置文件中正确指定了字符集。喜欢
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
src:Laravel 5.1 utf-8 saving to database
AND
我认为,您必须在此处使用laravel验证。因此它可以在处理之前验证请求。
Validator::extend('uniqueLocationInCompany', function ($attribute, $value, $parameters, $validator) {
$count = DB::table('locations')->where('name', $value)
->where('company_id', $parameters[0])
->count();
return $count === 0;
});
然后您可以在验证函数中访问此新规则:
'name' => "uniqueLocationInCompany:{$request->company_id}"
要进一步了解我们应如何在laravel中实施验证,请遵循此处的文档。
答案 1 :(得分:0)
我找到了solution!在阅读完最佳答案后,我将$old_location
的代码更改为:
$old_location = Location::where('company_id', $location->company_id)
->whereRaw('name COLLATE utf8mb4_bin', $name)
->first();
我对雄辩的where条件使用了不同的排序规则,并且它可以完美地工作。