Php Laravel 5.6-更新唯一属性

Php Laravel 5.6-更新唯一属性,php,laravel,laravel-5.6,Php,Laravel,Laravel 5.6,我有一个名为JuridicoFormRequest的表单请求,方法是“rules”: 问题是在数据库中,“Correo”属性必须是唯一的,与“pagina_web”相同。当我试图更新某个注册表“A”时,我写入另一个注册表“B”的相同“Correo”或另一个注册表的相同“pagina_web”时,会抛出一个错误。“rif”不会发生这种情况,因为它是主键,我已经用以下方法对其进行了验证: if ($this->juridico) { /*....*/ } 如果我这样做: if ($thi

我有一个名为JuridicoFormRequest的表单请求,方法是“rules”:

问题是在数据库中,“Correo”属性必须是唯一的,与“pagina_web”相同。当我试图更新某个注册表“A”时,我写入另一个注册表“B”的相同“Correo”或另一个注册表的相同“pagina_web”时,会抛出一个错误。“rif”不会发生这种情况,因为它是主键,我已经用以下方法对其进行了验证:

if ($this->juridico) {  /*....*/  }
如果我这样做:

if ($this->juridico) {  
 $rules['rif'] = 'required|max:40';
 $rules['correo'] = 'required|max:40|unique:juridico,correo';
 $rules['pagina_web'] = 'required|max:40|unique:juridico,pagina_web';
}
向我抛出验证消息(不是例外)“correo必须是唯一的”,而“correo”和“pagina_web”已被我正在更新的注册表占用

有办法解决这个问题吗

更新:我是这样解决的:

public function rules(){

      $rules = [
          'rif'=>'required|max:40|unique:juridico,rif',
          'correo'=>'required|max:40|unique:juridico,correo',
          'd_social'=>'required|max:50',
          'r_social'=>'required|max:50',
          'pagina_web'=>'max:40|unique:juridico,pagina_web',
          'capital'=>'required|numeric',
          'fk_lugar'=>'required|integer',
          'fk_lugar_fiscal'=>'required|integer',
          'fk_tienda'=>'integer',
          'num_carnet'=>'max:50'
      ];


     if ($this->juridico){
        $rules['rif'] = 'required|max:40';
        $rules['correo'] = 'required|max:40|unique:juridico,correo,'.$this->juridico.',rif';
        $rules['pagina_web'] = 'required|max:40|unique:juridico,pagina_web,'.$this->juridico.',rif';
     }

      return $rules;
  }
见文件

在AppServiceProvider中添加此

public function boot()
{
    Validator::extend('uniq', function ($attribute, $value, $parameters, $validator) {
        $data = $validator->getData();
        $tableName = $parameters[0];
        unset($parameters[0]);
        $primaryKey = 'id';

        $query = DB::table($tableName);
        // set main uniqueness condition
        $query->where($attribute, '=', $value);
        // if primary key exists - set to NOT be equal (for updating case)

        if (!empty($data[$primaryKey])) {
            $query->where($primaryKey, '!=', $data[$primaryKey]);
        }

        // check conditional columns
        if (!empty($parameters)) {
            foreach ($parameters as $column) {
                if (isset($data[$column])) {
                    $query->where($column, '=', $data[$column]);
                }
            }
        }
        $count = $query->count();
        return ($count == 0) ? true : false;
    });
}
用法

$rules['correo'] = 'required|max:40|uniq:juridico,correo,pagina_web';
见文件

在AppServiceProvider中添加此

public function boot()
{
    Validator::extend('uniq', function ($attribute, $value, $parameters, $validator) {
        $data = $validator->getData();
        $tableName = $parameters[0];
        unset($parameters[0]);
        $primaryKey = 'id';

        $query = DB::table($tableName);
        // set main uniqueness condition
        $query->where($attribute, '=', $value);
        // if primary key exists - set to NOT be equal (for updating case)

        if (!empty($data[$primaryKey])) {
            $query->where($primaryKey, '!=', $data[$primaryKey]);
        }

        // check conditional columns
        if (!empty($parameters)) {
            foreach ($parameters as $column) {
                if (isset($data[$column])) {
                    $query->where($column, '=', $data[$column]);
                }
            }
        }
        $count = $query->count();
        return ($count == 0) ? true : false;
    });
}
用法

$rules['correo'] = 'required|max:40|uniq:juridico,correo,pagina_web';
如果表使用的主键列名不是id,则可以在调用ignore方法时指定列名:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')
你可以定制它

如果表使用的主键列名不是id,则可以在调用ignore方法时指定列名:

'email' => Rule::unique('users')->ignore($user->id, 'user_id')

你可以定制它

$rules['correo']='required | max:40 | unique:correos',我不工作,因为如果我在更新时不更改“correo”或“pagina_web”,将向我抛出验证消息“correo必须是唯一的”或“pagina_web”必须是唯一的查看我的帖子回答您使用的规则强制您在字段中写入与数据库中已有内容不同的内容。因此,如果键入数据库中已有的数据,则会出现验证错误。这就是它的作用,这是你想要的还是?此应用程序的实际用途是什么?是的,但是,我正在更新的注册表已经是“correo”和“pagina_web”的所有者,为什么每次我要更新时它都会不同?$rules['correo']='required | max:40 | unique:correos',我无法工作,因为如果我在更新时不更改“correo”或“pagina_web”,will向我抛出验证消息“correo必须是唯一的”或“pagina_web”必须是唯一的请参阅我的帖子回答您使用的规则强制您在字段中编写与数据库中已有内容不同的内容。因此,如果键入数据库中已有的数据,则会出现验证错误。这就是它的作用,这是你想要的还是?这个应用程序的实际用途是什么?是的,但是,我正在更新的注册表已经是“correo”和“pagina_web”的所有者,为什么每次我要更新时它都会不同?对不起,但对我来说不起作用。抛出验证消息“correo必须是唯一的”,而该“correo”已由我正在更新的注册表获取。另外,我的表名为“juridico”,您是否使用了必填项?最大值:40?唯一值:juridico、correo、pagina_web??如果您在$data中更新了添加主键=>值对错,但不适用于我。抛出验证消息“correo必须是唯一的”,而该“correo”已由我正在更新的注册表获取。另外,我的表名为“juridico”,您是否使用了必填项?最大值:40?唯一值:juridico、correo、pagina_web??如果您在$data中进行了更新,请添加主键=>值对
'email' => Rule::unique('users')->ignore($user->id, 'user_id')