口才不佳的情况

时间:2019-05-27 07:45:54

标签: laravel

在我的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,它将不允许我这样做。我没有这样命名的位置。如果条件通过但雄辩的搜索失败。这怎么可能?

2 个答案:

答案 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中实施验证,请遵循此处的文档。

https://laravel.com/docs/5.8/validation

答案 1 :(得分:0)

我找到了solution!在阅读完最佳答案后,我将$old_location的代码更改为:

$old_location = Location::where('company_id', $location->company_id)
    ->whereRaw('name COLLATE utf8mb4_bin', $name)
    ->first();

我对雄辩的where条件使用了不同的排序规则,并且它可以完美地工作。