Laravel编码实践/最优化的存储方法

时间:2018-07-20 09:05:33

标签: laravel laravel-5.6

Laravel文档说应该存储如下:

public function store(Request $request)
{
    // Validate the request...

    $flight = new Flight;

    $flight->name = $request->name;

    $flight->save();
}

但是,为什么不这样做呢?

public function store(Request $request)
{
    Flight::create($request->all());
}

上面的示例非常简单,因为它只有一个字段。但是我想对多个字段执行某些操作并不得不分配每个字段,而不是像第二个示例那样仅传递整个$ request,这很繁琐吗?

2 个答案:

答案 0 :(得分:2)

第一个选项可让您更好地控制新模型中的内容。如果您存储请求中的所有内容,则用户可能会在store方法中注入您不想为新模型存储的字段。

例如,您的航班的is_top_priority列在Flight模型中被声明为可填充,但是在创建新的航班时,您只想为航班设置name(然后离开is_top_priority为空,或者表中默认值为0)。如果您编写Flight::create($request->all());,则用户可以注入<input name="is_top_priority" value="1">并利用您的代码。

这就是为什么不建议使用fill($request->all())的原因。使用$request->only(...)或按照第一个示例中的说明手动分配每个需要的字段。

答案 1 :(得分:1)

例如,您的模型具有一些字段,例如名称,电子邮件,密码,状态等。 要求输入验证名称,电子邮件和密码,如果要执行以下操作:

Flight::create($request->all());

客户端可以发送其他字段状态,但是您可以手动更改状态。我这样做:

Flight::create([
   'name' => $request->get('name'),
   'email' => $request->get('email'),
   'password' => $request->get('password'),
   'status' =>config('params.flight.status.not_active'),
]);