2015-04-17 25 views
4

是否有可能通過獨特的驗證方法額外where子句與變量?Laravel 5驗證唯一傳遞變量佔位符

這裏有一個例子:

在我的模型,我有我的驗證規則。

public static $rules = array(
    'amount' => 'required|numeric', 
    'user_id' => 'required|exists:users,id', 
    'cause_id' => 'required|exists:causes,id', 
    'circle_id' => 'required|unique:donations,circle_id,NULL,id,cause_id,:cause_id', 
); 

然後在我的控制器我運行:

$input = array(
    'amount' => Input::get('amount'), 
    'user_id' => $this->currentUser->id, 
    'cause_id' => $cause->id, 
    'circle_id' => Input::get('circle_id') 
); 

$validator = Validator::make($input, Donation::$rules); 

我怎樣才能得到驗證規則的cause_id沒有串聯呢?正如你可以按規則排列看,我已經試過了PDO風格:佔位符,但查詢將作爲執行: select count(*) as aggregate from donations where circle_id = '500' and cause_id = ':cause_id'

回答

2

我對你的情況建議是包裝在一個函數的規則:

public static function rules($causeId) 
{ 
    return array(
     'amount' => 'required|numeric', 
     'user_id' => 'required|exists:users,id', 
     'cause_id' => 'required|exists:causes,id', 
     'circle_id' => 'required|unique:donations,circle_id,NULL,id,cause_id,' . $causeId, 
    ); 
} 

然後調用你的函數,傳遞你的價值:

$validator = Validator::make($input, Donation::rules($yourCauseId)); 

我已經在過去像這樣的問題,我也想用其他字段中的值,在另一個規則場也是如此。這往往是解決問題的最簡單方法。

+0

謝謝,我已經決定要使用你的答案來解決我的問題。 – CharliePrynn

+0

不客氣:) – Jonathon

1

Laravel documentation on validation有一個子部分,標題爲「添加額外的where子句」中的唯一規則部分:

您還可以指定將被添加爲「在哪裏」的條款來查詢多個條件:

'email' => 'unique:users,email_address,NULL,id,account_id,1'

在上面的規則,只與1account_id行將被列入獨特的檢查。

不幸的是,你將有來連接一個變量的值,如果你想它的條件的一部分通過:

'circle_id' => 'required|unique:donations,circle_id,NULL,id,cause_id,'.$causeId, 

或者你使其更具可讀性,通過指定的驗證規則作爲數組:

'circle_id' => [ 
    'required', 
    'unique:donations,circle_id,NULL,id,cause_id,'.$causeId, 
], 
+0

謝謝。這兩個問題都是很好的答案。我決定以@jonathons方法作爲參數。 – CharliePrynn

+0

@馬丁豆如何可以忽略特定的記錄不檢查的獨特性,如用戶名!=空管檢查 –

+0

@ime您將需要驗證規則結合起來。有一個規則可以檢查該字段是否爲空,如果該值是唯一的,則使用另一個規則。 –

1

在Laravel 5中,您的「公共函數規則()」應該在您的FormRequest對象中:

<?php 
namespace your-namespace; 

use Illuminate\Foundation\Http\FormRequest; 
class MyFormRequest extends FormRequest { 

    public function rules() { 
     return [ 
      'field' => 'required|unique:table,column,user_id,' . $this->input('field-or-whatever-you-need-from-request'), 
     ]; 
    } 
} 
?> 
0

定義了我自己的類,所以在類中聲明的現有規則可以保留。

​​3210

然後添加用於Laravel一個魔術方法:

public function getGroupIdAttribute() { 
    return $this->id; 
} 

在服務提供商引導方法:

\Illuminate\Support\Facades\Validator::extend('unique_custom', '\Module\[email protected]'); 

然後加入類src文件夾爲包:

  <?php 

      namespace Module; 

      use Illuminate\Database\Eloquent\Model; 
      use Illuminate\Support\Facades\Cache; 
      use Illuminate\Support\Facades\DB; 
      use Illuminate\Support\Facades\Validator; 
      use Illuminate\Validation\Concerns\ValidatesAttributes as ValidatesAttributes; 
      use Illuminate\Validation\Rules\Unique; 

      class UniqueDataValidator extends Validator 
      { 

       use ValidatesAttributes; 

       protected $custom_messages = array(
        'unique_custom' => 'The :attribute field must be unique', 
       ); 


       /** 
       * Validate the uniqueness of an attribute value on a given database table. 
       * 
       * If a database column is not specified, the attribute will be used. 
       * 
       * @param string $attribute 
       * @param mixed $value 
       * @param array $parameters 
       * @return bool 
       */ 
       public function validate($attribute, $value, $parameters, $validator) 
       { 

        $this->requireParameterCount(3, $parameters, 'unique_custom'); 

        list($connection, $table) = $this->parseTable($parameters[0]); 
        $input = $validator->getData(); // All attributes 

        $column = $this->getQueryColumn($parameters, $attribute); 

        $param1 = explode("=", $parameters[1]); 
        $value = $input[$param1[0]]; // Set value to attribute value 

        $exclude = []; 
        if (isset($parameters[2])) { 
         $exclude_values = explode("=", $parameters[2]); 
         $exclude_value = @$input[$exclude_values[0]]; 

         if (!is_null($exclude_value)) { 
          $exclude_id = $exclude_values[0]; 
          $exclude_value = $input[$exclude_values[0]]; 

          if (!is_null($exclude_value)) { 
           $exclude[$exclude_values[0]] = $exclude_value; 
          } 
         } 
        } 

        $query = DB::table("$table")->where($column, '=', $value); 

        foreach ($exclude as $key => $value) { 
         $query->where(function ($query) use ($key, $value) { 
           $query->where($key, '!=', $value); 
         }); 
        } 

        $validator->setCustomMessages($this->custom_messages); 

        return $query->count() == 0; 

       } 


      } 

我沒有嘗試,只是ap掛起我的方法對現有的唯一方法,但因爲它們是在不同的類空間,這是造成問題與Laravel的本地方法:

use ValidatesAttributes; 
$this->validateUnique($attribute, $value, $parameters);