【问题标题】:Duplicate an AR record & re-insert this into the database复制 AR 记录并将其重新插入数据库
【发布时间】:2014-01-26 12:31:24
【问题描述】:

我想要复制一个 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 的新手,所以如果我犯了任何明显的错误/不良做法,请告诉我

【问题讨论】:

    标签: php database activerecord yii


    【解决方案1】:

    如果需要更通用的方式在 Yii2 框架中复制模型/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

    【讨论】:

      【解决方案2】:

      怎么样(yii2语法):

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

      【讨论】:

      • 在 postgresql 上,这只有在表没有主键的情况下才有用,如果你强制 NULL 到这个列,你会得到一个错误,所以如果 'id' 是主键,那么解决方法是替换:$模型->id = null;未设置($model->id);此外,您必须照顾独特的领域!
      • R U shure 关于这个?我的意思是我没有使用postgree,但是有没有自动增量功能?
      • 是的,我试过了,'id'列是'serial'(相当于'AI'列),但是PDO报错PK约束失败。 Unset 解决了这个问题。我还没有在任何其他 RDBM 上对其进行测试。无论如何,您的复制解决方案很好。
      • 这在我使用 MS SQL 时不起作用。按照@Michiel 的回答,我能够“克隆”记录。
      • 这是最简单的解决方案。谢谢!
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        克隆不起作用。您需要将属性分配给新对象:

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

        【讨论】:

        • 我如何在 $prizes 上执行相同的过程,这将返回一个以上项目的数组?
        • 这样的:foreach($models as $model) { $clone = new Competitions; $clone->attributes = $model->attributes; $clone->save(); }
        • 太棒了!我会给它一个镜头!
        • 但要小心:在这一行 $clone->attributes = $obj->attributes; 您只为安全属性赋值 (http://www.yiiframework.com/doc/api/1.1/CModel#setAttributes-detail)
        • 无论验证规则如何,我们如何克隆所有具有值的属性?
        猜你喜欢
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2018-09-27
        • 2012-03-10
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        • 2013-10-31
        相关资源
        最近更新 更多