Php Laravel 5验证唯一传递变量占位符

Php Laravel 5验证唯一传递变量占位符,php,validation,laravel,laravel-5,Php,Validation,Laravel,Laravel 5,是否可以使用变量传递唯一的验证方法额外的where子句 举个例子: 在我的模型中,我有我的验证规则 public static $rules = array( 'amount' => 'required|numeric', 'user_id' => 'required|exists:users,id', 'cause_id' => 'required|exists:causes,id', 'circle_id' => 'requ

是否可以使用变量传递唯一的验证方法额外的where子句

举个例子:

在我的模型中,我有我的验证规则

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);
如何在不连接验证规则的情况下获取原因id?正如规则数组所示,我尝试了PDO样式:占位符,但查询的执行方式如下:
选择count(*)作为捐款总额,其中circle\u id='500'和cause\u id=':cause\u id'

我对您的建议是将您的规则包装在一个函数中:

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));
我在过去遇到过类似的问题,我还想在规则中使用其他字段的值,也用于另一个字段。这往往是最简单的解决方法。

在“唯一规则”部分中有一个标题为“添加其他Where子句”的小节:

您还可以指定更多条件,这些条件将作为“where”子句添加到查询中:

'email'=>'唯一:用户、电子邮件地址、NULL、id、帐户id、1'

在上面的规则中,只有帐户id为
1
的行才会包含在唯一检查中

不幸的是,如果希望将变量值作为条件的一部分传递,则必须连接变量值:

'circle_id' => 'required|unique:donations,circle_id,NULL,id,cause_id,'.$causeId,
或者,通过将验证规则指定为数组,使其更具可读性:

'circle_id' => [
    'required',
    'unique:donations,circle_id,NULL,id,cause_id,'.$causeId,
],
在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'),
       ];
    }
}
?>

定义了我自己的类,因此类中声明的现有规则可以保留

protected $rules = array(
    "id" => 'unique_custom:data_groups,id,id=GroupId'
);
然后为Laravel添加了一个神奇的方法:

public function getGroupIdAttribute() {
    return $this->id;
}
在服务提供程序启动方法中:

    \Illuminate\Support\Facades\Validator::extend('unique_custom', '\Module\UniqueDataValidator@validate');
然后将类添加到包的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;

                }


            }

非常感谢。这两个问题都是很好的答案。我决定优先选择@jonathons方法。@Martin Bean我们怎么能忽略特定记录而不检查唯一性,比如用户名!=空的check@ime您需要合并验证规则。有一个规则检查字段是否为空,然后是另一个规则检查值是否唯一。我不明白,你能给我一个例子,如果用户名为空,则忽略用户名唯一性检查。谢谢:)@ime只需检查用户名是否已提交:
'username'=>'必需|唯一:表,列'
。如果没有,验证将失败,您不需要进行唯一检查。谢谢,我决定使用您的答案来解决我的问题。
use ValidatesAttributes;
$this->validateUnique($attribute, $value, $parameters);