Php 如何只更新FormRequest规则中的一组字段,而忽略Laravel5中的其余字段?
同一个表包含两个请求文件,分别填充一些字段组Php 如何只更新FormRequest规则中的一组字段,而忽略Laravel5中的其余字段?,php,laravel,laravel-5,Php,Laravel,Laravel 5,同一个表包含两个请求文件,分别填充一些字段组 public function update_f1(F1Request $request){ $projecttable->fill($request->all()); $projecttable->save(); } 另一个 public function update_f2(F2Request $request){ $projecttable->fill($reques
public function update_f1(F1Request $request){
$projecttable->fill($request->all());
$projecttable->save();
}
另一个
public function update_f2(F2Request $request){
$projecttable->fill($request->all());
$projecttable->save();
}
假设f1填充在f1请求中验证的字段\u abc1
f2填充在f2请求中验证的字段
现在,如果调用f2,它应该只填充字段\u abc2
而不是字段_abc1
,因为它未在F2Request
中验证,即使它是可填充的。任何人都可以从开发者工具添加字段\u abc1
。
是的,我可以像
$projecttable->field_abc2=$request->field_abc2
但对于大量字段,最好使用填充
$project->fill($request->all())
简而言之,只填写请求规则中存在的字段,忽略所有其他字段,即使可填写我想您想要的是使用
$request->only($request->rules);
其中,$rules
是带有字段的数组,而不是$request->all()代码>
来源:您可以使用replace()
方法筛选请求中的这些字段。
像这样:
class F1Request extends Request
{
private $rules = [
/* rules goes here */
]
public function authorize()
{
return true;
}
public function rules()
{
$this->filter();
return $this->rules;
}
public function filter()
{
$input = array_intersect_key($this->all(), $this->rules);
$this->replace($input);
}
}
如果这是常见的情况,甚至可以将filter()
方法移动到请求类。效果很好:)
Request::only()已经执行此操作。请参见第299行是的,但是-正如我理解的那样-目标是不总是提及所有需要的字段,而是有一些基于$rules的通用字段。您是对的,但是您可以将数组传递给Request::only()。因此,他只需要一个地方来设置规则数组并将其传递给唯一的函数,尽管您的想法可能也很优雅。就个人而言,我可能会在控制器中使用Request::only(),以使代码在将来更具可读性(对我而言)。但这是我的偏好,每种情况都不同。我同意这一点,但我并不是说他必须访问Request::只是,直接地,我的推理适用于当前扩展的Request$Request,无论他当前在哪里使用它。我真的不明白为什么要添加一个做了它已经支持的事情的函数,它只需要一个$rules数组传递给它,但可能是由于缺乏经验和/或不称职,我的推理有缺陷。你能解释一下区别吗?很高兴看到它有所帮助。
public function update_f1(F1Request $request){
$rules = $request->rules();
$validfieldsgroup = array_keys($rules);
$projecttable->fill($request->only($validfieldsgroup));
$projecttable->save();
}