Для добавления нового студента необходимо заполнить поля фамилии, имени и даты рождения. Однако, когда ученик редактируется, дата рождения не обязательна. Пока работает только метод 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');
}
Как мне заставить забыть о поле даты рождения, если ученик обновился?
какой метод вы используете для обновления PUT|PATCH или POST






Вы можете сделать это, как показано ниже
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...
Создайте 2 разных набора правил .... возможно :)