Laravel 4.1。我想更新一个城市,检查规则,并且在唯一的检查中失败。
规则:
public static $rules = [
'name' => 'required|alpha_dash|unique:cities',
'slug' => 'alpha_dash|unique:cities',
'seo_title' => 'required|max:60|unique:cities',
'seo_description' => 'required|max:160|unique:cities',
'rank' => 'integer',
'visible' => 'integer'
];
我知道,我可以这样说:
'name' => 'required|alpha_dash|unique:cities, name, ##',
其中## - id,但我无法动态地将id设置为更新的。
'name' => "required|alpha_dash|unique:cities, name, $id", // doesnt work
'name' => "required|alpha_dash|unique:cities, name, $this->id", // doesnt work
有没有办法正常做到?
答案 0 :(得分:1)
你可以分开来做。
一种简单的方法是根据不同的操作使用不同的规则。当您创建模型时,您将使用当前的规则。
当您更新模型时,您会将unique:cities
更改为exists:cities
我通常使用验证服务来执行此操作。
在services /中创建一个基本抽象Validator,它有一个pass()函数。
对于每个模型,您可以在CityValidator中创建ModelValidator。你把规则放在哪里:
public static $rules = [
'new'=>[
'name' => 'required|alpha_dash|unique:cities',
'slug' => 'alpha_dash|unique:cities',
'seo_title' => 'required|max:60|unique:cities',
'seo_description' => 'required|max:160|unique:cities',
'rank' => 'integer',
'visible' => 'integer'],
'edit'=>[
'name' => 'required|alpha_dash|exists:cities',
'slug' => 'alpha_dash|unique:cities',
'seo_title' => 'required|max:60|exists:cities',
'seo_description' => 'required|max:160|exists:cities',
'rank' => 'integer',
'visible' => 'integer'
]
];
答案 1 :(得分:0)
第三个参数接受要忽略的值...如果要执行WHERE
子句,请执行以下操作:
'name' => array("required", "alpha_dash", "unique:cities,name,null,id,id,$this->id"...
文档说:
添加其他Where子句
您还可以指定更多条件,将其添加为“where” 查询的条款:
'email' => 'unique:users,email_address,NULL,id,account_id,1'
在上面的规则中,只有account_id为1的行才会包含在唯一检查中。
通过示例学习:
email => unique:users,email_address,id,NULL,field_1,value_1,field_2,value_2,field_x,value_x
生成查询:
SELECT
count(*) AS AGGREGATE
FROM
`entries`
WHERE
`email_address` = ?
AND `id` <> NULL
AND `field_1` = `value_1`
AND `field_2` = `value_2`
AND `field_x` = `value_x`
答案 2 :(得分:0)
我使用fadion/ValidatorAssistant
找到了一种优雅的方法:
<?php
use Fadion\ValidatorAssistant\ValidatorAssistant;
class CityValidator extends ValidatorAssistant {
// standard rules
public static $rules = [
'name' => 'required|alpha_dash',
'slug' => 'alpha_dash',
'seo_title' => 'required|max:60',
'seo_description' => 'required|max:160',
];
// some preparation before validation
protected function before()
{
// Inject the given city id into the unique rules
$this->rules['name'] .= 'unique:cities,name,' . $this->inputs['id'];
$this->rules['slug'] .= 'unique:cities,slug,' . $this->inputs['id'];
$this->rules['seo_title'] .= 'unique:cities,seo_title,' . $this->inputs['id'];
$this->rules['seo_description'] .= 'unique:cities,seo_description,' . $this->inputs['id'];
}
当您需要在数据库范围内使用多个字段时,几乎可以肯定有一种更优雅的方法,但是当您只需要一个部件是唯一的时候,上述情况非常适用。