Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何只更新FormRequest规则中的一组字段,而忽略Laravel5中的其余字段?_Php_Laravel_Laravel 5 - Fatal编程技术网

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