验证更新(不包括某些字段)

时间:2018-11-29 12:24:11

标签: php laravel validation crud

添加新学生需要填写姓氏,名字和出生日期。但是,当学生被编辑时,出生日期不是必需的。到目前为止,只有“存储”方法有效:

表单请求:

public function rules()
    {
        return [
            'group_id' => 'required|numeric',
            'last_name' => 'required|alpha|min:2',
            'given_name' => 'required|alpha|min:2',
            'date_of_birth' => 'required',
        ];
    }

控制器:

public function store(StudentValidation $request)
    {
        Student::create($request->all());

        return redirect()->route('students.index');
    } 

public function update(StudentValidation $request, Student $student)
        {

            $student->update($request->except(['date_of_birth']));

            return redirect()->route('students.index');
    }

如果学生有更新,我该如何忘记出生日期字段?

4 个答案:

答案 0 :(得分:2)

假设您使用的是标准RESTful路由,例如Post用于创建,PUT/PATCH用于更新,您可以执行以下操作:

public function rules()
{
    $rules = [
        'group_id'      => 'required|numeric',
        'last_name'     => 'required|alpha|min:2',
        'given_name'    => 'required|alpha|min:2',
        'date_of_birth' => 'required',
    ];

    if ($this->method() === 'POST') {
        $rules['date_of_birth'] = 'required';
    }

    return $rules;
}

答案 1 :(得分:1)

您必须使用这样的规则,还必须使用PUT|PATCH

public function rules()
{
    switch($this->method())
    {
        case 'GET':
        case 'DELETE':
        {
            return [];
        }
        case 'POST':
        {
            return [
                'group_id'      => 'required|numeric',
                'last_name'     => 'required|alpha|min:2',
                'given_name'    => 'required|alpha|min:2',
                'date_of_birth' => 'required',
            ];
        }
        case 'PUT':
        case 'PATCH':
        {
            return [
                'group_id'      => 'required|numeric',
                'last_name'     => 'required|alpha|min:2',
                'given_name'    => 'required|alpha|min:2',
            ];
        }
    default:break;
    }
}

答案 2 :(得分:0)

您可以按照以下步骤进行操作

check_numbers()

基本上,如果您没有学生证(即您正在创建一个学生),则需要输入生日。假设您的主键是“ student_id”。您可以/应该将“ student_id”更改为您的主键列名。

答案 3 :(得分:0)

您可以这样做

  

StudentValidation请求类

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Validator;

class StudentValidation extends FormRequest
{
   private $rulesValidation = [
        'group_id'      => 'required|numeric',
        'last_name'     => 'required|alpha|min:2',
        'given_name'    => 'required|alpha|min:2',
    ];

    /**
     * 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 [
            //
        ];
    }


    public function addStudent($request)
    {
       $this->rulesValidation['date_of_birth'] = 'required';
       Validator::make($request,
           $this->rulesValidation
       )->validate();
    }

    public function updateStudent($request)
    {
        Validator::make($request,$this->rulesValidation)->validate();
    }


}
  

控制器端代码..

public function store(StudentValidation $request)
    {
       //if fail automatically throw error ...
       $request->addStudent($request->all());  //call here method before create student...
        Student::create($request->all());
        return redirect()->route('students.index');
    } 

public function update(StudentValidation $request, Student $student)
        {
            $student->updateStudent($request->all()); //same as create 
            $student->update($request->except(['date_of_birth']));
            return redirect()->route('students.index');
    }
  

假设以后您将方法类型 post 更改为 put ,则您的代码为   失败,但如果您这样做,则代码可以正常工作完全,并且   再次重用您的代码,如果要在另一个控制器中使用相同的验证请求类,则可以使用...