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

时间:2015-10-19 10:23:24

标签: php laravel-5 unique rules 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。   例如,考虑一个"更新配置文件"屏幕包括   用户的姓名,电子邮件地址和位置。当然,你会想要的   验证电子邮件地址是否唯一。但是,如果只是用户   更改名称字段而不是电子邮件字段,您不需要   要抛出验证错误,因为用户已经是其所有者   电子邮件地址。你只想抛出一个验证错误   用户提供已由其他人使用的电子邮件地址   用户。要告诉唯一规则忽略用户的ID,您可以通过   ID作为第三个参数:

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

我尝试在我的规则中使用它:

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

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

1 个答案:

答案 0 :(得分:0)

例如,我们需要将联系信息更新到“用户”表中。
在模型用户中,我创建了此静态方法:

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 ));

:-)