Laravel规则更新唯一列(如果存在)

时间:2017-10-14 10:56:41

标签: php laravel laravel-5.5

我有一个名为position的表,其中user_position是唯一的数字。如果表中不存在新的user_position或者等于当前的user_position,我只想更新记录。我该如何表达这样的规则?我目前的规则不允许更新。

$rule=[    
    'user_position' => 'required|integer|unique:positions'
]

3 个答案:

答案 0 :(得分:0)

使用updateOrCreate()方法:

$positions = Position::updateOrCreate(
    ['user_position' => $userPosition],
    ['name' => $newName, 'age' => $newAge]
);
  

您可能还会遇到要更新现有模型或创建新模型(如果不存在)的情况。 Laravel提供updateOrCreate方法,只需一步即可完成此操作。

https://laravel.com/docs/5.5/eloquent#other-creation-methods

答案 1 :(得分:0)

答案和详细信息可以在https://laravel.com/docs/5.5/validation#rule-unique

的文档中找到

因此遵循文档我的规则就变成了

$rule=['user_position' => 'required|integer|unique:positions,id']

答案 2 :(得分:0)

来自Docs

  

强制使用唯一规则忽略给定ID:

     

有时,您可能希望在唯一检查期间忽略给定的ID。   例如,考虑一个"更新配置文件"屏幕包括   用户的姓名,电子邮件地址和位置。当然,你会想要的   验证电子邮件地址是否唯一。但是,如果只是用户   更改名称字段而不是电子邮件字段,您不需要   要抛出验证错误,因为用户已经是其所有者   电子邮件地址。

以下是使用必需忽略实现此目的的方法。

如果您使用Form Requests进行验证,则可以执行此类操作。假设url类似于/ positions / 1 / edit进行编辑和position / create

use Illuminate\Validation\Rule;
....

public function rules()
{
    //position id
    $id = $this->route()->parameter('position'));
    //or like this if id is in parameter as 2nd segment
    //$id = $this->segment(2); 

    return [
        'user_position' => [
            'required',
            Rule::unique('positions')->ignore($id)
        ]
    ];
}

如果您没有使用请求类进行验证

 //get id of parameter positions
 //using Illuminate\Http\Request $request;
 $id = $request->route()->parameter('position'));
 //or using helper
 // $id = request()->route()->parameter('position'));

 $rule=[ 
     'user_position' => [
           'required',
           Rule::unique('positions')->ignore($id)
      ]
 ];