Проверка обновления за исключением некоторых полей

Для добавления нового студента необходимо заполнить поля фамилии, имени и даты рождения. Однако, когда ученик редактируется, дата рождения не обязательна. Пока работает только метод store:

Форма запроса:

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

Как мне заставить забыть о поле даты рождения, если ученик обновился?

Создайте 2 разных набора правил .... возможно :)

RiggsFolly 29.11.2018 13:26

какой метод вы используете для обновления PUT|PATCH или POST

Shailendra Gupta 29.11.2018 13:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
63
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете сделать это, как показано ниже

public function rules()
{

   $rules = [
        'group_id' => 'required|numeric',
        'last_name' => 'required|alpha|min:2',
        'given_name' => 'required|alpha|min:2',
    ];

   if (!$this->has('student_id')) // primary key i assume it is student_id
    {
        $rules += ['date_of_birth'=> 'required'];
    }
    return $rules;
}

Это в основном, если у вас нет студенческого билета (то есть вы создаете студента), тогда требуется дата рождения. Предполагается, что ваш первичный ключ - "student_id". Вы можете / должны изменить "student_id" на любое имя столбца для вашего первичного ключа.

Ответ принят как подходящий

Предполагая, что вы используете стандартные маршруты 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;
}

вы должны использовать подобное правило, а также использовать 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;
    }
}

ты можешь сделать это

StudentValidation Request Class

<?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();
    }


}

Controller side code..

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

assume in future you change method type post to put then your code is fail but if you do like that then your code is work perfectly and reused your code again again and if you want to used in another controller same validation request class then you can used...

Другие вопросы по теме