Php Laravel 5验证唯一传递变量占位符
是否可以使用变量传递唯一的验证方法额外的where子句 举个例子: 在我的模型中,我有我的验证规则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
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);