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

时间:2014-01-08 12:02:53

标签: php database activerecord yii

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

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

此查询基本上查询奖品表并获取特定比赛的所有行。对于奖品对象,我想基本上重新插入/复制相同的信息,除了我想手动设置的竞争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();

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

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

4 个答案:

答案 0 :(得分:19)

克隆无效。您需要将属性分配给新对象:

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

答案 1 :(得分:3)

如何(yii2语法):

$model=Competitions::findOne([':competition_id' => $post['competition_id']]);
$model->id = null;
$model->isNewRecord = true;
$model->save();

答案 2 :(得分:2)

我的问题的答案虽然上面的Michiel帮助了我 - 或者如果你不介意添加另一个答案我会给你接受的答案。

foreach($models as $model) 
{ 
   $clone = new Competitions;
   $clone->attributes = $model->attributes;
   $clone->competition_id = '123' // custom var i am setting manually.
   $clone->save(); 
}

答案 3 :(得分:1)

如果需要在Yii2 Framework中复制模型/ ActiveRecord的更通用方法,则可以使用以下解决方案:

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

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