Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel 5 Validation unique pass variable placeholder

Is it possible to pass the unique validation method extra where clauses with a variable?

Heres an example:

In my model I have my validation rules.

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',
);

And then in my controller I run:

$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);

How can I get the cause_id in the validation rule without concatenating it? As you can see by the rules array, I have tried the PDO style :placeholder, but the query is executed as: select count(*) as aggregate from donations where circle_id = '500' and cause_id = ':cause_id'

like image 895
CharliePrynn Avatar asked Apr 17 '15 10:04

CharliePrynn


3 Answers

My suggestion in your case would be to wrap your rules in a function:

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,
    );
}

And then call your function, passing in your value:

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

I've had problems like this in the past, I've also wanted to use the values from other fields, in the rule for another field too. This tends to be the easiest way to get around it.

like image 169
Jonathon Avatar answered Oct 24 '22 01:10

Jonathon


The Laravel documentation on validation has a sub-section titled, “Adding Additional Where Clauses” in the unique rule section:

You may also specify more conditions that will be added as "where" clauses to the query:

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

In the rule above, only rows with an account_id of 1 would be included in the unique check.

Unfortunately you will have to concatenate a variable value if you want it passed as part of the conditions:

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

Or you make it more readable by specifying validation rules as an array:

'circle_id' => [
    'required',
    'unique:donations,circle_id,NULL,id,cause_id,'.$causeId,
],
like image 1
Martin Bean Avatar answered Oct 24 '22 02:10

Martin Bean


in Laravel 5, your "public function rules()" is supposed to be in your FormRequest object:

<?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'),
       ];
    }
}
?>
like image 1
marc Avatar answered Oct 24 '22 03:10

marc