【问题标题】:How to validate unique fields while updating in make:request in laravel如何在make中更新时验证唯一字段:laravel中的请求
【发布时间】:2018-07-05 10:17:26
【问题描述】:

我正在Laravel 5.5 中开发一个小型应用程序,我正在使用updateContact 创建一个请求并具有唯一的电子邮件验证规则,同时在控制器内使用相同的验证我可以轻松进行:

$contact = Contact::find($request->id);
Validator::make($data, [
    'first_name' => 'required|max:255',
    'email' => 'required', Rule::unique('contacts')->ignore($contact->id),
    'address' => 'max:255',
    'city' => 'max:255',
    'state' => 'max:255',
    'country' => 'max:255',
]);

并且可以通过我通过php artisan make:request UpdateContact 提出请求并在updateContact.php 中添加以下内容来验证:

namespace App\Http\Requests;

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

class UpdateContact extends FormRequest
{
    /**
     * 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()
    {
        $contact = Contact::find($request->id);
        return [
            'first_name' => 'required|max:255',
            'email' => 'required', Rule::unique('contacts')->ignore($contact->id),
            'company_id' => 'required',
            'address' => 'max:255',
            'city' => 'max:255',
            'state' => 'max:255',
            'country' => 'max:255',
        ];
    }

    public function messages()
    {
        return [
            'company_id.required' => 'Company name is required'
        ];
    }
}

但我不知道 $request->id 我该如何使用它?

【问题讨论】:

  • 我不确定,但您可以将其作为属性/参数注入 rules() 方法中。试试public function rules(Request $request)。然后你可以让$request->id
  • @HCK Laravel 请求本身是一个Request,因为我们采用use Illuminate\Foundation\Http\FormRequest; 这是是否在其中再次注入请求的令人困惑的部分?
  • 您可以使用request帮助器访问当前请求

标签: php laravel laravel-5.5 laravel-validation laravel-request


【解决方案1】:

为什么您又在 Request 对象中找到带有 id 的联系人?

您可以简单地使用以下代码:

 'email' => 'required', Rule::unique('contacts')->ignore($this->id),

您正在使用 id 查找 Contact,然后再次使用 $contact->id 您在 Request 对象中已有的 强>$这个。 您可以简单地使用 $this->id,它会为您提供 Contact 的 id。没有必要写下一行:

 $contact = Contact::find($this->id);

因为

$this->id is same as $contact->id

您还可以使用以下代码验证唯一电子邮件:

'email' => "required|unique:users,email,$this->id,id" //use double quotation marks

它会做同样的事情:

'email' => 'required', Rule::unique('contacts')->ignore($this->id),

看看在Request类中使用的sn-p

public function rules()
{
    switch ($this->method()) {
        case 'POST':
        {
            return [
                'name' => 'required',
                'email' => 'required|email|unique:users',
                'password' => 'required'
            ];
        }
        case 'PUT':
        case 'PATCH':
        {
            return [
                'name' => 'required',
                'email' => "required|unique:users,email,$this->id,id"
                 //OR you can use below rule
                // 'email' => Rule::unique('users')->ignore($this->id),
            ];
        }
        default: break;
    }
}

【讨论】:

    【解决方案2】:

    要在其中调用类的对象,您可以使用 $this 变量范围。然后访问作为对象一部分的任何变量。例如 $this->id$this->name

    如果你想在同一个类中访问静态函数,那么你可以使用 self 关键字。 例如你有一个静态函数

    public static function add($a, $b){
        return $a+$b;
    }
    

    您调用 add 方法,例如 self::add(2,2);

    【讨论】:

      【解决方案3】:

      在 FormRequest 类中,$this 是请求对象的变量范围。只需执行以下操作即可获取 ID 属性

      $contact = Contact::find($this->id);
      

      表单中的任何其他字段也是如此。

      【讨论】:

        猜你喜欢
        • 2019-11-11
        • 2018-08-09
        • 1970-01-01
        • 2023-03-27
        • 2018-12-25
        • 2020-11-12
        • 1970-01-01
        • 2020-02-18
        • 2016-03-31
        相关资源
        最近更新 更多