Laravel 5唯一的表单验证忽略id / slug


Laravel 5 Unique form validation ignore id / slug

这些是我在我的类中的规则:

class AppointmentsController extends Controller
{
    protected $rules = [
        'appointment' => ['required', 'min:5'],
        'slug'        => ['required', 'unique:appointments'],
        'description' => ['required'],
        'date'        => ['required', 'date_format:"Y-m-d H:i"'],
    ];

这是在laravel官方文档:

有时,您可能希望在惟一性检查期间忽略给定的ID。例如,考虑一个"更新配置文件"屏幕,其中包括用户名、电子邮件地址和位置。当然,你会想要的验证电子邮件地址是否唯一。但是,如果用户只是更改name字段而不是E-mail字段,您不需要的所有者,因此将抛出验证错误电子邮件地址。的情况下才会抛出验证错误用户提供一个已被其他用户使用的电子邮件地址用户。要告诉唯一规则忽略用户的ID,您可以通过ID作为第三个参数:

'email' => 'unique:users,email_address,'.$user->id.',user_id'

我试着在我的规则中使用这个:

'slug'        => ['required', 'unique:appointments,id,:id'],

这确实忽略了当前行,但它完全忽略了它。我想要完成的是,我想要它忽略当前行,只有当弹头没有改变。当它被更改为在另一行中已经唯一的东西时,我希望它抛出一个错误。

唯一验证器是这样工作的

unique:table,column,except,idColumn

在你的例子中,你可以这样做:

获取你想要验证的id,你可以从路由或其他任何适合你的方式获得它;像这样的

$id = $this->route('id');
'slug'        => ['required','unique:appointments,slug,'.$id],

例如,我们需要在Users表中更新联系人信息。
在我的模型User中,我创建了这个静态方法:

static function getContactDataValidationRules( $idUserToExcept ) {
    return [
        'email' => 'required|email|max:255|unique:users,email,' . $idUserToExcept,
        'pec' => 'required|email|max:255',
        'phone' => 'required|regex:/^([0-9's'-'+'(')]*)$/|min:8|max:20',
        'mobile' => 'required|regex:/^([0-9's'-'+'(')]*)$/|min:8|max:20',
        'phone2' => 'required|regex:/^([0-9's'-'+'(')]*)$/|min:8|max:20',
        'recovery_email' => 'required|email|max:255',
    ];
}

在我的UsersController中,在更新用户的方法中,我已经:

$id = $request->input('id');
$request->validate(User::getContactDataValidationRules( $id ));

: -)