【问题标题】:Laravel - Store new record in database through APILaravel - 通过 API 在数据库中存储新记录
【发布时间】:2018-04-08 19:25:39
【问题描述】:

我想通过 API 在我的数据库中创建一条新记录,但我收到错误“消息”:“来自 Postman 的数组到字符串转换(SQL:插入....)

API 路由:

Route::post('/posts','PostController@store');

我的控制器中的存储功能:

public function store(Request $request)
    {


        $post= new Post;
        $post->all = $request->all();

        $post->save();

    }

【问题讨论】:

  • all 是什么类型的?它是一个数据库字段,或者您想以这种方式将所有请求字段设置为模型属性?如果你想设置请求中的所有字段 - 你需要$post->fill($request->all);
  • $post->all 只是 post 的一个属性(代表一个列)。您不能将请求中的数组分配给它。
  • 我该怎么做?
  • 为什么不使用普通列作为值?
  • 但请记住,fillable 属性必须具有用于批量分配的字段数组。更多详情请参考laravel.com/docs/5.5/eloquent - Mass Assignment

标签: php laravel eloquent


【解决方案1】:

首先,检查您的 post#all 字段类型。如果它是数据库字段 - 您只能设置相同类型的数据,例如对于字符串类型,您只能设置 php 字符串。

如果它不是一个文件,但你想设置从请求到模型的所有属性,你可以使用Model::create($request->all())

但是,在这样做之前,您需要指定一个可填充的 或模型上的受保护属性,因为所有 Eloquent 模型都保护 默认情况下反对批量分配。

Source - 批量分配

换句话说,可以在模型fillable 中定义一个属性,该属性将是一个数组并包含可批量分配的字段(以您的方式 - 来自请求的字段)。

最好使用$request->only() 并仅提供您想从请求中取出的数据,这将减少用户错误导致您出现问题的可能性,因为$request->all() 将包含任何输入数据,包括查询字符串。

【讨论】:

  • @AndrewWillis laravel 有没有像 symfony $request->request 这样只检索 POST 数据的方法?
  • 我不知道,尽管盲目地使用用户提供的所有数据并不是明智之举,因为任何人都可以添加 POST 数据。任何人也可以将 JSON 内容发送到 API 端点,因此在使用验证后,我发现最好的方法是转到 $request->only(),并且只使用我期望用户提供的字段。
  • @AndrewWillis 我同意过滤数据是安全性的又一步,但控制器变得有点混乱。一般来说,我认为控制器不应该知道模型有什么字段。也许最好为模型设置具有可变属性的静态fields 属性。然后将模型中的fillable 属性设置为fields。然后控制器将拥有Model::create($request->only(Model::fields));。这个怎么样?
  • @AndrewWillis 或者可以从 symfony 获取其他解决方案。它在一个字段中有一组表单字段。例如,如果模型是 Post,则表单字段“标题”将具有名称 post[title]。然后控制器将拥有Model::create($request->get('post'))
  • 这种方法的问题在于模型/请求/控制器都需要以某种方式相互了解。这是为什么使用存储库和实体/边界/交互器方法的完美示例,其中所有内容都委托给应用程序,这超出了问题的范围?
猜你喜欢
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多