Laravel 5 Запрос класса

В Laracasts, в частности Laravel 5 Fundamentals, Джеффри упоминал об использовании одного и того же класса запросов для создания и обновления модели. Я пробовал это, но получаю ошибку:

вот мой RequestClass

<?php namespace CRM\Http\Requests;

use CRM\Http\Requests\Request;

class ClientRequest extends Request {

/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public $rules = [
'company'   => 'required|min:3',
'firstname' => 'required|min:3',
'lastname'  => 'required|min:3',
'email'     => 'required|email|unique:clients,email',
'phone'     => 'required|min:6|phone|unique:clients,phone',
'address'   => 'required|min:3'
];

public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
if($clients = $this->clients){

$this->rules['email'] .= ','.$clients ;
$this->rules['phone'] .= ','.$clients ;
}

return $this->rules;
}

public function messages()
{
return ['phone' => 'The phone number is not valid. Please confirm and try again.'];
}

}

Он отлично работает, когда я создаю новую запись, но выдает ошибку при обновлении записи.

Вот сообщение об ошибке

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'company:"BWA"' in 'where clause' (SQL: select count(*) as aggregate from `clients` where `email` = [email protected] and `company:"BWA"` <> {"id":1 and `firstname:"richard"` = lastname:"keep" and `email:"support@example`.`co`.`ke"` = phone:"+27521341661" and `address:"test address"` = deleted_at:null and `created_at:"2015-04-15 08:46:45"` = updated_at:"2015-04-15 09:24:55"})

Вот мой метод контроллера

   /**
* Update the specified resource in storage.
*
* @param  int  $id
* @return Response
*/
public function update(Client $client, ClientRequest $request)
{
$client->update($request->all());

return redirect('clients')->with('success', 'Client Updated Successfully');
}

Кто-нибудь с подсказкой, что здесь происходит?

0

Решение

В случае редактирования записи вам необходимо передать идентификатор текущей записи в наборе правил для уникальности. Для вашего случая правила редактирования записи могут быть написаны так

public $rules = [
'company'   => 'required|min:3',
'firstname' => 'required|min:3',
'lastname'  => 'required|min:3',
'email'     => 'required|email|unique:clients,email',
'phone'     => 'required|min:6|phone|unique:clients,phone,id',
'address'   => 'required|min:3'
];

Также вам нужно будет написать отдельные правила для редактирования и вставки регистра.

Пример кода для обработки нескольких правил в одном классе запросов

public function rules()
{
$user = User::find($this->users);
switch($this->method())
{
case 'GET':
case 'DELETE':
{
return [];
}
case 'POST':
{
return [
'user.name.first' => 'required',
'user.name.last'  => 'required',
'user.email'      => 'required|email|unique:users,email',
'user.password'   => 'required|confirmed',
];
}
case 'PUT':
case 'PATCH':
{
return [
'user.name.first' => 'required',
'user.name.last'  => 'required',
'user.email'      => 'required|email|unique:users,email,'.$user->id,
'user.password'   => 'required|confirmed',
];
}
default:break;
}
}
0

Другие решения

Мне удалось это решить. Я заменил

    if($clients = $this->clients){

$this->rules['email'] .= ','.$clients ;
$this->rules['phone'] .= ','.$clients ;
}

с

if($this->method == "PUT"){
$this->rules['email'] .= ','.$this->clients->id ;
$this->rules['phone'] .= ','.$this->clients->id ;
}
0

По вопросам рекламы [email protected]