有没有办法发出一个INSERT语句而不是在每个对象上调用save()方法?我可以在PropelObjectCollection上调用save()吗?
答案 0 :(得分:1)
您可以从类本身调用PropelObjectCollection上的save,但它会发出多个insert语句来完成工作。
如果它们全部包含在Propel默认执行的事务中,那么发出一个INSERT而不是多个就没有太大的性能提升。另外,考虑到Propel递归保存相关对象的方式,我怀疑尝试这样做会增加很多复杂性。
<?php
/**
* This file is part of the Propel package.
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @license MIT License
*/
/**
* Class for iterating over a list of Propel objects
*
* @author Francois Zaninotto
* @package propel.runtime.collection
*/
class PropelObjectCollection extends PropelCollection
{
/**
* Save all the elements in the collection
*
* @param PropelPDO $con
*
* @throws PropelException
*/
public function save($con = null)
{
if (!method_exists($this->getModel(), 'save')) {
throw new PropelException('Cannot save objects on a read-only model');
}
if (null === $con) {
$con = $this->getConnection(Propel::CONNECTION_WRITE);
}
$con->beginTransaction();
try {
/** @var $element BaseObject */
foreach ($this as $element) {
$element->save($con);
}
$con->commit();
} catch (PropelException $e) {
$con->rollback();
throw $e;
}
}
答案 1 :(得分:0)
将所有save()调用放在一个事务中就足够了。在我的代码中,我不得不在MySQL数据库中插入270条记录。
没有交易的结果: 真正的0m15.127s 用户0m0.300s sys 0m0.056s
交易结果: 真正的0m0.687s 用户0m0.244s sys 0m0.036s
存在巨大差异。