FuelPHPのModel_CRUDクラスで必要なカラムのみ更新
こんにちは、ピーターです。
FuelPHP 1.6の話です。
こんなテーブルとモデルがあったとします。
SQL
CREATE TABLE `tb_user` ( `user_id` int NOT NULL AUTO_INCREMENT, `name` varchar(50), `email` varchar(50), PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
PHP
class Model_User extends Model_Crud { protected static $_table_name = 'tb_user'; protected static $_primary_key = 'user_id'; }
Model_Crudクラスでfind()してsave()すると、すべてのカラムにセットするUPDATE文が発行されます。
PHP
$user_id = 1; $user = Model_User::find_by_pk($user_id); $user->email = 'hoge@example.com'; $user->save();
SQL
UPDATE `tb_user` SET `user_id` = '1', `name` = 'hoge', `email` = 'hoge@example.com' WHERE `user_id` = '1'
すべてのカラムにセットされるのは気持ち悪いので、必要なカラムのみセットする方法はないか探してみました。
PHP
$user = Model_User::forge(); $user->user_id = 1; $user->email = 'hoge@example.com'; $user->is_new(false); $user->save();
SQL
UPDATE `tb_user` SET `user_id` = 1, `email` = 'hoge@example.com' WHERE `user_id` = 1
`name` = 'hoge'
はなくなりましたが、まだ `user_id` = 1
が余計ですね。
モデルに $_properties
プロパティを追加してみました。
PHP
class Model_User extends Model_Crud { protected static $_table_name = 'tb_user'; protected static $_primary_key = 'user_id'; protected static $_properties = [ 'name', 'email', ]; }
そして再度実行。
PHP
$user = Model_User::forge(); $user->user_id = 1; $user->email = 'hoge@example.com'; $user->is_new(false); $user->save();
SQL
UPDATE `tb_user` SET `email` = 'hoge@example.com' WHERE `user_id` = 1
うまくいきました。
最近のコメント