LoginSignup
20
22

More than 5 years have passed since last update.

Phalconが生成するMySQLのUPDATEクエリーについて

Last updated at Posted at 2013-11-03

useDynamicUpdateについて追記(2013年12月3日)。

Phalcon 1.2.3でどのようなクエリーが生成されるか確認しました。

ModelのSave

findメソッドでSELECT、saveメソッドでUPDATE。

model_save.php
$robots = TheRobots::find(array('id=1'))->getFirst();
$robots->year = $robots->year + 1;
$robots->save();

実行されるSQL。

model_save.sql
SELECT `the_robots`.`id`, `the_robots`.`name`, `the_robots`.`type`, `the_robots`.`year` FROM `the_robots` WHERE `the_robots`.`id` = 1
UPDATE `the_robots` SET `name` = 'doraemon', `type` = 'cat', `year` = 2056 WHERE `id` = '1'

全カラムがUPDATEされました。
できれば変更のないカラム更新は避けたい。

ModelのuseDynamicUpdate

useDynamicUpdateで変更のないカラムをUPDATEされないようにできます。

ModelのinitializeメソッドでuseDynamicUpdate(true)を実行します。

TheRobots.php
class TheRobots extends \Phalcon\Mvc\Model
{
    public function initialize() {
        $this->useDynamicUpdate(true);
    }
model_save.php
$robots = TheRobots::find(array('id=1'))->getFirst();
$robots->year = $robots->year + 1;
$robots->save();

実行されるSQL。

model_save.sql
SELECT `the_robots`.`id`, `the_robots`.`name`, `the_robots`.`type`, `the_robots`.`year` FROM `the_robots` WHERE `the_robots`.`id` = 1
UPDATE `the_robots` SET `year` = 2076 WHERE `id` = '1'

ModelManagerのexecuteQuery

ModelManagerでPHQLという独自のクエリー言語で任意のクエリーを実行できます。

modelmanager.php
$this->modelsManager->executeQuery('UPDATE TheRobots SET year = year + 1 WHERE id = 1');

ほぼ普通のSQLですが、上の1行で次のSQLが実行されます。useDynamicUpdateは設定していません。

modelmanager.sql
SELECT `the_robots`.`id`, `the_robots`.`name`, `the_robots`.`type`, `the_robots`.`year` FROM `the_robots` WHERE `the_robots`.`id` = 1
START TRANSACTION
UPDATE `the_robots` SET `name` = 'doraemon', `type` = 'cat', `year` = `the_robots`.`year` + 1 WHERE `id` = '1'
COMMIT

トランザクションが実行され、全カラム更新となりました。

TheRobotsにuseDynamicUpdate(true)を実行していた場合は次の様に値の変更があったカラムのみになります。

SELECT `the_robots`.`id`, `the_robots`.`name`, `the_robots`.`type`, `the_robots`.`year` FROM `the_robots` WHERE `the_robots`.`id` = 1
START TRANSACTION
UPDATE `the_robots` SET `year` = `the_robots`.`year` + 1 WHERE `id` = '1'
COMMIT

ちなみにPHQLではUPDATEの後ろは「テーブル名」ではなくて「モデル名」です。
モデルにモデル名とは異なるテーブル名をマッピングしていた場合に注意しましょう。
次のコードのようにマッピングしていた場合はUPDATE TheRobotsになります。

TheRobots.php
class TheRobots extends \Phalcon\Mvc\Model
{
    public function getSource() {
        return 'the_robots';
    }

Phalcon\Db\Adapter\Pdo\Mysqlのexecute

データベースのアダプターを使うと任意のSQLを実行できます。
DIにsetしているアダプターを使用している例です。

adapter.php
$adapter = $this->di->get('db');
$adapter->execute('UPDATE the_robots SET year = year + 1 WHERE id = 1');
adapter.sql
UPDATE the_robots SET year = year + 1 WHERE id = 1

任意のSQLを実行したければアダプターを使いましょう。

20
22
0

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
20
22