web-dev-qa-db-ja.com

ARレコードを複製し、これをデータベースに再挿入します

複製しようとしているARモデルがありますが、外部キーを手動で変更する必要があります。

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

このクエリは基本的に賞金テーブルをクエリし、特定のコンテストのすべての行を取得します。賞品オブジェクトを使用して、手動で設定するコンテストIDを除いて、基本的に同じ情報を再挿入/複製したいと思います。

基本的に1行しかなく、うまく機能する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を初めて使用するので、明らかなエラー/悪い習慣をした場合はお知らせください

13
Zabs

クローン作成は機能しません。新しいオブジェクトに属性を割り当てる必要があります。

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

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

4
nadar

(yii2構文)はどうですか:

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

上記の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
Zabs