2015-04-15 4 views
0

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

вот мой 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:"[email protected]`.`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

Добавить 'дд ($ request-> все())' в начале 'обновления()' и вывесить выход здесь – lukasgeiter

+0

я все еще получаю ту же ошибку потому что запрос '$ request' получен из класса ClientRequest, который имеет ошибку! – Richie

ответ

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

Я знаю, что мы делали это еще в Laravel 4.2, но в Laravel все изменилось. Я не хочу иметь два класса запросов для создания и обновления модели. – Richie

+0

Вам не нужно создавать два класса объектов для обработки этого, вы можете определить другой набор правил в том же классе запросов на основе метода запроса, как если бы его метод POST определял правила для добавления записи, и если тогда его метод PATCH правила для редактирования записи. –

+0

Я думал, что это if-statement 'if ($ clients = $ this-> clients) {...}' решает это. Как я могу использовать ваш подход? Пожалуйста, напишите пример кода – Richie

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 ; 
} 
Смежные вопросы