【问题标题】:saveMany() not storing datasaveMany() 不存储数据
【发布时间】:2019-06-18 10:33:39
【问题描述】:

鉴于以下模型:

Car Model
- parts: hasMany(Parts::class)

Part Model
- car: belongsTo(Car::class)

跑步

Car::find(1)->parts()->saveMany(Part::hydrate($request->parts));

正确返回一个 Parts 列表,3 个有 id,一个没有,所以这是 3 个模型需要更新,一个需要插入。 但是查看我的数据库,没有插入任何一行,并且发出 dd(Car::find(1)->parts) 返回一个空数组。 createMany 有效,但这不会更新具有 id 的模型 - 而是创建新模型。 来自documentation

如果需要保存多个相关模型,可以使用saveMany方法

...

savecreate 之间的区别在于 save 接受一个完整的 Eloquent 模型实例,而 create 接受一个普通的 PHP array

那么createMany 有效但saveMany 无效的原因是什么?

【问题讨论】:

    标签: laravel eloquent relationship


    【解决方案1】:

    您已经通过文档中的引用自行解释了。

    saveMany() 使用 eloquent 模型,这对于更新现有部件非常有用。它不适用于我假设 $request->parts 来自您的前端的通用数组。

    createMany() 使用通用数组,因为您的 $request->parts(我再次假设)是它传递的数组。

    【讨论】:

    • $request->parts 确实是一个数组,但是Part::hydrate($request->parts) 从输入中返回Part 模型的集合。现在,我可以遍历该集合并在每个对象上调用save(),但是有数千个部件,这是一种非常糟糕的方法。我只是不知道为什么createMany 与数组一起使用,而saveMany 在文档声明它是使用它们的预期方式时不与模型集合一起使用。
    • 在将其插入 saveMany 功能之前,您可以尝试给它们补水吗? $hydrated = Part::hydrate($request->parts) 然后插入 $hydrad?只是看看有什么不同?
    • 刚刚尝试迭代 $hydrated 并在每个实例上调用 ->save() - 似乎没有一个工作。问题可能来自其他地方(可能是因为我还没有对输入进行验证......)
    【解决方案2】:

    这是对Post::hydrate 的滥用。 hydrate 函数返回一个模型集合,这些模型被标记为来自数据库。由于水合后没有任何变化,save() 被忽略,因为它们没有发生任何变化。 此外,saveMany() 不关心指定的id,它会不加选择地创建一个新对象。最后,我将验证移至相关模型,并在每次更新时执行delete()/createMany()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2019-10-23
      相关资源
      最近更新 更多