Laravel在更新时检查唯一规则但不包括自身

66

我正在更新部分使用我的验证规则以确保唯一性。

在插入或添加时,唯一性规则为'Email' => array('unique:driver_details'),它将检查唯一列。

但是,这在更新部分失败。在更新中,它满足其他规则,并且在电子邮件的唯一性上,它正在检查自己的唯一列并失败,因为它看到了自己的字段。

那么,如何检查除了数据库中自身的值以外的唯一性?


可能是Laravel 4验证电子邮件唯一约束条件的重复问题。 - patricus
@patricus:我理解了你的问题,但是在你的回答中没有提到如何获取$id。如果他们要验证自己的个人资料,可以通过Auth::user()->id获得他们的id,对于管理员将这些部分分配给其他部分,我应该设置会话并在模型内获取吗??? - user3388086
你目前是如何获取你正在尝试更新的记录的ID的? - patricus
我正在将所有的值发送到模型,$validation = Validator::make($DriverData, DriverModel::$updaterules); - user3388086
我在这里发布了一个新问题,应该很清楚,请你看一下这里:http://stackoverflow.com/questions/28205762/how-to-pass-the-value-inside-the-model-for-checking-in-the-rules - user3388086
24个回答

2

有一种更简单的方法,我使用的是路由模型绑定, URL格式为

/something/{user}/something

return [
        'level' => 'required|max:5|unique:users,level,'. optional($this->user)->id,
    ];

2
<?php

namespace App\Http\Requests\Admin\User;

use App\Model\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;


class UpdateRequest extends FormRequest
{
    protected $id;

    public function __construct(Request $request)
    {
        $this->id = (integer) $request->route()->user;
    }

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'first_name' => 'required|max:20',
            'last_name' => 'nullable|max:20',
            'mobile' => 'required|size:10|unique:users,mobile,'.$this->id,
           
        ];
    }
}

2
对于我的情况,我正在使用laravel 10,并且遇到了相同的问题。我的表名是suppliers,以下是我为请求设置规则的方式。
'supplier_name' => 'required|string|max:20',
'supplier_company' => 'required|string|max:25',
'supplier_telephone' => 'required|string|max:13',
'supplier_email' => 'required', 'email',Rule::unique('suppliers')->ignore($supplier->id),

1

您可以尝试这样做,检查列中的删除情况是否为 null。

例如:

$this->validate($request, [
  'email' => 'required|string|max:255|unique:table_name,email,'.$request->id.',id,deleted_at,NULL'
]);

1
    'phone' => 'string|required|max:11|min:11|unique:users,phone,'.Auth::user()->phone.',phone'

1

这个对我在 Laravel 8 上有效。

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class UserRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name' => 'required|string',
            'email' => [
                'required',
                'email',
                Rule::unique('users', 'email')->ignore($this->user)
            ]
        ];
    }
}

1

这是另一种解决方案,需要注意路由参数,它是用户的“id”。与Arian Acosta提到的解决方案进行比较。

路由:

Route::patch('users/{id}', [UserController::class, 'update']);

控制器:

public function update(UserRequest $request, $id) 
{
    // ...
}

表单请求:
class UserRequest extends FormRequest
{
    public function rules()`
    {
        return [
            'name' => 'required|string',
            'email' => 'required|email|unique:users,email,'.$this->id.',id',
        //...
        ];
    }
    //...
}

1

它会工作...

$this->validate($request, 
    [
        'name' => 'required|unique:your_table_name,column_name,'.$request->auto_increment_id
    ],
    [
        'name.required' => 'Name should not be empty',
        'name.unique' => 'Name Already Exists'
    ]
);

1

我也遇到了这个问题一段时间。尝试这个方法:

$v = Validator::make($request->all(), [
    'email' => ['required',
    Rule::unique('<table_name>')->ignore(<your_table_id_to_ignore>),
    ]
]);

适用于Laravel 5.8。我不知道它是否适用于较低版本的Laravel。


1
我在创建和更新时使用相同的规则。但是在更新时,我需要忽略自身。
这是我使用的代码:
public function rules()
{
    return [
        'email' => [
            'required',
            'email',
            Rule::unique('users')->ignore($this->user->id ?? 0),
        ],
        // ...other fields
    ];
}

如果是更新操作,那么 $this->user->id 将被忽略。 否则,如果是创建操作,它将忽略 id 0,因为它根本不存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接