0

有没有办法发出一个 INSERT 语句而不是在每个对象上调用 save() 方法?我可以在 PropelObjectCollection 上调用 save() 吗?

4

2 回答 2

1

将所有 save() 调用放在一个事务中就足够了。在我的代码中,我必须在 MySQL 数据库中插入 270 条记录。

无交易结果:real 0m15.127s user 0m0.300s sys 0m0.056s

交易结果:真实 0m0.687s 用户 0m0.244s sys 0m0.036s

这是个很大的差异。

于 2014-11-09T10:11:32.343 回答
1

您可以从类本身对 PropelObjectCollection 调用 save ,但它会发出多个插入语句来完成工作。

如果它们都包装在 Propel 默认执行的事务中,则发出一个 INSERT 而不是多个 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;
        }
    }
于 2013-08-06T10:10:01.687 回答