В настоящее время я пытаюсь добавить валидацию для customer_no в таблицу компаний.Laravel Eloquent Уникальная проблема проверки
public function rules()
{
$id = Company::where('customer_no', '=', $this->get('customer_no'))->first();
$id = $id['attributes']['id'];
return [
'customer_no' => 'required|unique:companies,customer_no,'.$id,
];
}
После добавления новой компании с уже существующим customer_no я получаю следующее сообщение об ошибке из уникальной миграции базы данных.
SQLSTATE[23000]: Integrity constraint violation:
1062 Duplicate entry 'abc' for key 'companies_customer_no_unique'
(SQL: update `companies` set `customer_no` = abc, `updated_at` = 2016-03-15 14:50:28 where `id` = 1)
Но вместо этого он должен перенаправить меня на предыдущую страницу и показать сообщение об ошибке. Это уже работает для требуемого поля, а переменная $ id содержит идентификатор компании (проверяется с помощью var_dump).
Edit: (companyController хранения)
/**
* Store a newly created resource in storage.
*
* @param ManageCompanyRequest $request
* @return Response
*/
public function store(ManageCompanyRequest $request)
{
$company = $request->all();
if(!(CompanyType::where('id','=',$request->company_type_id)->exists() || CompanyType::where('name', 'like', $request->company_type_id)->exists()))
$company['company_type_id'] = CompanyType::create(['name' => $request->company_type_id])->id;
else if(CompanyType::where('name', 'like', $request->company_type_id)->exists())
$company['company_type_id'] = CompanyType::where('name', 'like', $request->company_type_id)->first(['id'])->id;
$address = Address::create($request->all());
$company['address_id'] = $address->id;
Company::create($company);
return redirect('companies');
}
CompanyController Update:
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return Response
*/
public function update(ManageCompanyRequest $request, $id)
{
if(!(CompanyType::where('id','=',$request->company_type_id)->exists() || CompanyType::where('name', 'like', $request->company_type_id)->exists()))
$request->company_type_id = CompanyType::create(['name' => $request->company_type_id])->id;
else if(CompanyType::where('name', 'like', $request->company_type_id)->exists())
$request->company_type_id = CompanyType::where('name', 'like', $request->company_type_id)->first(['id'])->id;
$company = Company::find($id);
Company::find($id)->update([
'company_type_id' => $request->company_type_id,
'customer_no' => $request->customer_no,
'name' => $request->name,
'comment' => $request->comment
]);
Address::where('id', '=', $company->address_id)->update([
'country_code_id' => $request->country_code_id,
'city' => $request->city,
'region' => $request->region,
'postal_code' => $request->postal_code,
'street' => $request->street
]);
return redirect('companies');
}
Вы можете попытаться добавить инструкцию try catch в свой метод в своем контроллере. Это приведет к тому, что код не сможет создать такую уродливую ошибку переднего плана. Можете ли вы добавить метод контроллера в код? – Duikboot
Нужно ли предоставить идентификатор в массив правил проверки? Я думал, что просто указать «customer_no» => «required | unique: company» будет достаточно. То, что вы делаете с этим правилом, фактически заставляет валидатор IGNORE поставляемого идентификатора. См. «Принуждение уникального правила для игнорирования заданного идентификатора»: https://laravel.com/docs/master/validation – btl
Идентификатор необходим для редактирования существующих компаний. Чтобы обновить запись, я должен игнорировать client_no для этой конкретной записи. Он работает в магазине без какой-либо части, но не работает для обновлений. Добавлен магазин() и обновление() компанииController. –