laravel 4.1更新失败的唯一验证

时间:2014-04-14 06:07:12

标签: php validation laravel laravel-4

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

有没有办法正常做到?

3 个答案:

答案 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'];
    }

当您需要在数据库范围内使用多个字段时,几乎可以肯定有一种更优雅的方法,但是当您只需要一个部件是唯一的时候,上述情况非常适用。