验证不包括某些字段的更新
Validating update excluding some fields
添加新学生需要填写姓氏、名字和出生日期字段。但是,当编辑学生时,出生日期不是必需的。目前只有 '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');
}
我怎样才能让它忘记出生日期字段以防学生更新?
你可以像下面那样做
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"。您 can/should 将 "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...
添加新学生需要填写姓氏、名字和出生日期字段。但是,当编辑学生时,出生日期不是必需的。目前只有 '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');
}
我怎样才能让它忘记出生日期字段以防学生更新?
你可以像下面那样做
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"。您 can/should 将 "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...