タイトル通りのファッキンな仕様。
テーブルを作る。
実際に発行されたSQLがどうなっているかというと、
で、どうやらこれをどうにかする手段がないっぽいという驚愕の事実。
update()の引数に値を渡すことで動作を変更することができます。
しかしこの場合も、差分といいつつ更新される可能性があるのはc_indexとc_hoge列だけです。
c_hogeは同じなので更新されるのはc_indexだけとなります。
SQLがどうなったかというと、
結局テーブル定義変更するか自力でクエリを組むかとかいった、DB_DataObjectの利点を何も使えない解決方法をとるしかありません。
構成によっては非常に不便を強いられる作りでした。
まあ、今時DB_DataObjectなんて使ってる方が悪いんですがね。
テーブルを作る。
CREATE TABLE `test` ( `c_primary` varchar(16) NOT NULL COMMENT '主キー', `c_unique` varchar(16) NOT NULL COMMENT 'ユニークキー', `c_index` varchar(16) NOT NULL COMMENT 'インデックス', `c_hoge` varchar(16) NOT NULL COMMENT '特に何もなし', PRIMARY KEY (`c_primary`), UNIQUE KEY `k_unique` (`c_unique`), KEY `k_index` (`c_index`) )とりあえず値を入れておく。
INSERT INTO test (c_primary, c_unique, c_index, c_hoge) VALUES ('a','b','c','d'); INSERT INTO test (c_primary, c_unique, c_index, c_hoge) VALUES ('w','x','y','d');その後update()を実行。
//DB_DataObject $table = DB_DataObject::factory('test'); //取得 $table->c_primary = 'a'; $table->find(); //値をセット $table->c_unique = 'e'; $table->c_index = 'f'; $table->c_hoge = 'g'; //更新 $table->update();こうした場合、testテーブルの値は('a','e','f','g')('w','x','y','d')になってることを期待するわけですが、実際は1行もアップデートされていません。
実際に発行されたSQLがどうなっているかというと、
UPDATE test SET c_index='f', c_hoge='g' WHERE (c_primary='a') AND (c_unique='e')何故かユニークキーがWHERE側に回っています。
で、どうやらこれをどうにかする手段がないっぽいという驚愕の事実。
update()の引数に値を渡すことで動作を変更することができます。
//aを取得 $table->c_primary = 'a'; $table->c_unique = 'b'; $table->find(); //wを取得 $table2->c_primary = 'w'; $table2->c_unique = 'x'; $table2->find(); //差分を更新 $table->update($table2);引数にDB_DataObjectを渡すことで、両者の差分のみをアップデートすることができます。
しかしこの場合も、差分といいつつ更新される可能性があるのはc_indexとc_hoge列だけです。
c_hogeは同じなので更新されるのはc_indexだけとなります。
//WHERE句を指定 $table->addWhere("c_primary='a'"); $table->update(DB_DATAOBJECT_WHEREADD_ONLY);addWhere()を指定後update(DB_DATAOBJECT_WHEREADD_ONLY)とすると、指定したWHERE句でupdateすることができます。
SQLがどうなったかというと、
UPDATE test SET c_index='f', c_hoge='g' WHERE (c_primary='a')ユニーク列どっか行きやがった。
結局テーブル定義変更するか自力でクエリを組むかとかいった、DB_DataObjectの利点を何も使えない解決方法をとるしかありません。
構成によっては非常に不便を強いられる作りでした。
まあ、今時DB_DataObjectなんて使ってる方が悪いんですがね。
PR