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

Php Laravel 5唯一表单验证忽略id/slug,php,laravel-5,unique,rules,slug,Php,Laravel 5,Unique,Rules,Slug,以下是我的课堂规则: class AppointmentsController extends Controller { protected $rules = [ 'appointment' => ['required', 'min:5'], 'slug' => ['required', 'unique:appointments'], 'description' => ['required'],

以下是我的课堂规则:

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作为第三个参数:

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

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

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

唯一验证器就是这样工作的

unique:table,column,except,idColumn
$id = $this->route('id');

'slug'        => ['required','unique:appointments,slug,'.$id],
因此,在您的情况下,您可以这样做:

获取您想要验证的id,您可以通过路由或任何其他适合您的方式获取;诸如此类

unique:table,column,except,idColumn
$id = $this->route('id');

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

例如,我们需要将联系人信息更新到用户表中
在我的模型用户中,我创建了以下静态方法:

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

:-)

这样试试看:
'slug'=>['required','unique:appointment,slug,:id']
是的,我应该说我试过了,运气不好。我的猜测是,它应该是这样工作的,所以我需要弄清楚为什么它不能。谢谢你的评论:)你为什么把这个放在控制器里?它应该放在自定义请求类中,而不能在控制器中使用。不确定这是否是导致问题的原因。仅供参考-如果您有自定义用户id列名(例如“用户id”而不是“id”),则规则如下所示:'email'=>['required','email','unique:user\u table\u name,email\u col\u name',.$user->user\u id',user\u id']