复制AR记录并将其重新插入数据库

Zab*_*abs 8 php database activerecord yii

我有一个AR模型,我试图复制,但只需要手动更改外键.

$_POST['competition_id'] = 99;
$prizes = CompetitionPrizes::model()->findAll('competition_id =:competition_id',array(':competition_id'=> $_POST['competition_id']));
Run Code Online (Sandbox Code Playgroud)

此查询基本上查询prizes表并获取特定竞争的所有行.对于奖品对象,我想基本上重新插入/复制相同的信息,除了我想手动设置的竞争ID.

我为AR对象做了类似的事情,基本上只有一行并且运行良好,但是在这种情况下,竞争可以有多个奖项,而相同的代码则不会.

// My existing code for duplication process
$obj = Competitions::model()->find('competition_id=:competition_id', array(':competition_id' => $post['competition_id']));
$clone = clone $obj;
$clone->isNewRecord = true;
unset($clone->competition_id); // i want to remove this so it is auto inserted instead via the db
$clone->save();
Run Code Online (Sandbox Code Playgroud)

这很有效 - 如何在奖品的'集合'上修改它,并在设置我自己的'competition_id'值时将其复制到数据库中.

注意 - 我是Yii的新手,所以如果我有任何明显的错误/不良做法,请告诉我

Mic*_*iel 21

克隆将无法正常工作.您需要将属性分配给新对象:

$obj = Competitions::model()->find('competition_id=:competition_id', array(':competition_id' => $post['competition_id']));
$clone = new Competitions;
$clone->attributes = $obj->attributes;
$clone->save();
Run Code Online (Sandbox Code Playgroud)

  • 这样的事情:`foreach($ models as $ model){$ clone = new Competitions; $ clone-> attributes = $ model-> attributes; $ clone-)>保存(; }` (3认同)
  • 但要小心:在这一行 `$clone->attributes = $obj->attributes;` 中,你只为安全属性赋值([http://www.yiiframework.com/doc/api/1.1/CModel#setAttributes -detail](http://www.yiiframework.com/doc/api/1.1/CModel#setAttributes-detail)) (3认同)

nad*_*dar 5

如果需要在 Yii2 框架中使用更通用的方式复制模型/ActiveRecord,您可以使用以下解决方案:

$copy = clone $model;
$copy->isNewRecord = true;
foreach ($model->getPrimaryKey(true) as $field => $value) {
    unset($copy->{$field});
}
$copy->save();
Run Code Online (Sandbox Code Playgroud)

关于重复模型的 GitHub 问题讨论:https : //github.com/yiisoft/yii2/issues/7544#issuecomment-77158479