LoginSignup
7
8

More than 5 years have passed since last update.

FuelPHP で Orm/Model 使用して連続でInsertした時に2件目以降がupdateになる。

Last updated at Posted at 2016-01-28

FuelPHP1.7でOrm/ModelについてInsert後そのオブジェクトを使用して再度Insertしようとした時にアップデートになった。
どうやらプロパティのis_newを更新しないとだめらしい。
Orm/Modelの場合はis_newはprotectedなのでそのまま更新したら追加になった。

$model = Model_XXXXX::forge();
$model->is_new =true;

なおModel_Crudを使用している場合はメソッドで更新できる。

$model = Model_XXXXX::forge();
$model->is_new(true);

しかし、このテーブルのプライマリキーをauto_incrementしていたら、その値がリセットされないという事象が発生する。。。。

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2' for key 'PRIMARY'

ソースは以下の通り

$records = array(
    array('カラム1'=>'値1')
,   array('カラム1'=>'値2')
);

$model = Model_XXXXX::forge()

foreach($records as $record) {
    $model->set($record);
    $model->is_new = true;
    $model->save();
}

むかつく・・・
ORMのソースみてたらcloneするとis_newも含めて新規に設定するみたいなので以下のようにして回避した。とりあえずこれでいいか。。。

こちらでOK

$records = array(
    array('カラム1'=>'値1')
,   array('カラム1'=>'値2')
);


foreach($records as $record) {
    $obj = Model_XXXXX::forge()
    $obj->set($record);
    $obj->save();
    unset($obj);
}

こっちでもできますが、無駄が多いです。

$records = array(
    array('カラム1'=>'値1')
,   array('カラム1'=>'値2')
);

$model = Model_XXXXX::forge()

foreach($records as $record) {
    $obj   = clone $model;
    $obj->set($record);
    $obj->save();
    unset($obj);
}
7
8
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8