Laravel 5.6-更新唯一属性

问题描述 投票:0回答:2

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

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';
    $rules['pagina_web'] = 'required|max:40';
 }
 return $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”已由我正在更新的注册表获取。

有没有办法解决这个问题?

UPDATE:我以这种方式解决:

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;
  }
php laravel laravel-5.6
2个回答
3
投票
use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

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

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

您可以自定义它!


1
投票

请参见文档https://laravel.com/docs/5.5/validation#rule-unique

$rules['correo'] = 'required|max:40|unique:juridico,correo,pagina_web';

 $rules['correo'] = [
    'required',
    'max:40',
    Rule::unique('juridico')->where(function ($query) use ($paginaWeb) {
       return $query->where('pagina_web', $paginaWeb);
    })
];

在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';
© www.soinside.com 2019 - 2024. All rights reserved.