忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/22 18:10 |
PHP5.3 DB_DataObject::update()がユニークキーを更新できない
タイトル通りのファッキンな仕様。

テーブルを作る。
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


2012/10/01 22:28 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Minecraft1.3.2 DiamondTorch *Unofficial* 1.3.2.0 ダイヤモンドトーチのMinecraft1.3.2対応版 | HOME | 買ったものリスト 2012/09/30>>
忍者ブログ[PR]