Php 如何使用Propel 2 ORM在一个查询中将多行插入数据库?
我把我的项目改为推进。我知道,为了尽可能实现平台无关性(例如,MySQL中的Php 如何使用Propel 2 ORM在一个查询中将多行插入数据库?,php,sql,propel,Php,Sql,Propel,我把我的项目改为推进。我知道,为了尽可能实现平台无关性(例如,MySQL中的LAST\u INSERT\u ID()),某些特定数据库特有的功能将不会由Propel实现。但是,我无法在中找到任何文档,无法同时插入多行。我也没能在某处或通过搜索找到它的任何参考资料 推进2中是否有此功能 我知道这样做是可行的(改编自推进文档): 然而,有没有一种ORM方法不涉及直接的SQL操作?推进的思想是让您尽可能少地编写SQL。所以这个例子是不可能的 我不明白你所处的环境要求所有的东西都立即被拯救,而不是被创造
LAST\u INSERT\u ID()
),某些特定数据库特有的功能将不会由Propel实现。但是,我无法在中找到任何文档,无法同时插入多行。我也没能在某处或通过搜索找到它的任何参考资料
推进2中是否有此功能
我知道这样做是可行的(改编自推进文档):
然而,有没有一种ORM方法不涉及直接的SQL操作?推进的思想是让您尽可能少地编写SQL。所以这个例子是不可能的 我不明白你所处的环境要求所有的东西都立即被拯救,而不是被创造出来,但我会同意的
您需要做的是从对象集合开始
$collection = new PropelObjectCollection();
然后创建推进对象并将其放入集合中
$newBook = (new Book)->setFirstName('leo')
->setLastName('Tolstoy');
如果有定义良好的数组,也可以使用
$newBook = (new Book)->fromArray($wellDefinedArray);
创建对象后,可以保存它们,然后将它们弹出到集合中:
$collection->append($newBook);
$collection->save();
并保存收藏:
$collection->append($newBook);
$collection->save();
我强烈认为您应该在制作对象时保存每个对象:
(new Book)->setFirstName('Leo')
->setLastName('Tolstoy')
->save();
您可以在循环中调用上述函数,或者将它们全部附加到循环中的集合中
如果您有一个非常大的数据集,循环可能不是最好的
(new PropelObjectCollection)->setModel('Book')
->importFrom('JSON',$someJson)
->save();
请看一看中PropelObjectCollection的强大功能
我希望这能让你更接近答案。不,这是不可能的。类似于CakePHP的
saveMany
()的东西在同一个表格提交多行HTML表单时会非常有用。谢谢你的反馈。我相信这个答案更适用于推进1而不是推进2,因为目前可以在推进2中使用PDO事务。希望一次写入多个插入的原因是它减少了服务器的压力。在阅读了其他文章后,ORM设计师似乎倾向于认为多个写操作通常不会引起关注。但是,当一个应用程序有多个写操作时,我相信在***Query.php文件下使用允许多行插入的语法是很有价值的。不过还是值得思考的,谢谢!这是非常糟糕的建议。典型的性能调优建议是,由于开销,尽量减少到数据库的往返次数。批量插入是一种常见的需求。如果一个工具不允许它,那么它就是一个糟糕的工具。