2016-03-15 5 views
1

В настоящее время я пытаюсь добавить валидацию для 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'); 
} 
+0

Вы можете попытаться добавить инструкцию try catch в свой метод в своем контроллере. Это приведет к тому, что код не сможет создать такую ​​уродливую ошибку переднего плана. Можете ли вы добавить метод контроллера в код? – Duikboot

+0

Нужно ли предоставить идентификатор в массив правил проверки? Я думал, что просто указать «customer_no» => «required | unique: company» будет достаточно. То, что вы делаете с этим правилом, фактически заставляет валидатор IGNORE поставляемого идентификатора. См. «Принуждение уникального правила для игнорирования заданного идентификатора»: https://laravel.com/docs/master/validation – btl

+0

Идентификатор необходим для редактирования существующих компаний. Чтобы обновить запись, я должен игнорировать client_no для этой конкретной записи. Он работает в магазине без какой-либо части, но не работает для обновлений. Добавлен магазин() и обновление() компанииController. –

ответ

2

Если вы хотите, чтобы контроллер перенаправить вас обратно в форму, вам нужно обновить проверки , При обнаружении конфликта в базе данных (т.е. customer_no не является уникальным), вы должны сделать:

return Redirect::back()->withInput()->withErrors(['Error message here']); 

Э.Г.

if(!(CompanyType::where('id','=',$request->company_type_id)->exists() || CompanyType::where('name', 'like', $request->company_type_id)->exists())) 
     return Redirect::back()->withInput()->withErrors(['Details are not unique']); 
+0

Это хорошая обходная проблема для моей проблемы, и я очень ее ценю. В любом случае, я бы ожидал, что правило валидации: unique: companies, customer_no, '. $ Id, чтобы сделать то же самое. Было бы намного более чистым способом заставить всю работу валидации работать. –

+0

Да, это тоже сработает. Но так как я не видел, что вы используете Validation, я бы хотел, чтобы вы использовали обходной путь. –

Смежные вопросы