【问题标题】:How move a save model outside a loop in Yii?如何在 Yii 中将保存模型移到循环之外?
【发布时间】:2015-06-26 21:32:24
【问题描述】:

我需要将$model->save() 句子移到循环之外,例如:

foreach ($nodes as $i => $node) { 
    $model = new Singer();
    $model->name = $node['name'];
    $model->birthDate = $node['birthDate'];
    $model->save();
}

有没有办法在循环之外保存模型?我的意思是如果$nodes 中有100000 条记录,save 方法将被执行100000 次?? 谢谢!

【问题讨论】:

标签: activerecord yii


【解决方案1】:
    $values = array();

    foreach ($nodes as  $node) {
        $values[]=array(
            'name' => $node['name'],
            'birthDate' => $node['birthDate']
        );
    }

    Yii::app()->db->schema->getCommandBuilder()->createMultipleInsertCommand(Singer::model()->tableName(), $values)->execute();

【讨论】:

    【解决方案2】:

    没有其他解决方案。如果您有 100,000 条记录,则必须迭代 100,00 次! 您也可以通过这种方式使用CDbCommand 来加快响应速度:

    $values = "";
    foreach ($nodes as $i => $node) {
         $values.= "(". $node['name'] . "," . $node['birthDate'] . ")" . ",";
    }
    $values = rtrim($values, ",") //remove last "," from $values
    $sql = 'ISERT INTO "singer"(name, birthDate) VALUES '.$values;
    $connection = Yii::app() -> db;
    $command = $connection -> createCommand($sql);
    $command -> execute();
    

    【讨论】:

    • 我投了赞成票,但想警告值中的字符串过大。我会考虑在循环中创建一个插入子句数组并使用 join() 而不是 rtrim。
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多