CakePHP3を触ってみました 〜それでも予約語を使いたい〜

リザーブ友の会って、昔あったよね

おまとめ三行

今日は短めに行きます
グレイヴアクセントっていうのをつける必要があります
trueにするとパフォーマンスが低下するらしいです

今日は短めに行きます。

それじゃあ早速ヒアウィーゴー。



予約語って何ぞ?

MySQLには、予約語ってのがいくつかあります。

予約語っていうのは、えーと、言葉で説明すると、何て言えば良いんだ……? 例えばselectとかdeleteとかwhereとかlimitみたいに、SQLに最初から存在しているような語句は、予約語になります。他にもVARCHARとかINTみたいな型の名前とかも、予約語になります。

この予約語をカラムに使っている場合、場合によってはエラーになることがあります。

例えば、削除フラグ用にdeleteというフィールド名を使っているとして、その削除フラグが立っていないデータだけを取得したいとすると、SQL文はこんな感じになります。

SELECT * FROM posts WHERE delete = 0

ここでは、値が0のときに削除フラグが立っていないと思ってください。テーブル名はpostsとしています。

一見問題なさそうに見えますが、これだとエラーになります。deleteが予約語だからです。

エラーを回避するには、グレイヴアクセントっていうのをつける必要があります。

SELECT * FROM posts WHERE `delete` = 0

これでエラーを回避することができます。クォーテーションじゃないので、注意ね。

予約語はいくつもあるんですが、phpMyAdminなどを使っている場合は、予約語を使っていると「The column name ‘delete’ is a MySQL reserved keyword.」みたいなメッセージが出るので分かると思います。

公式サイトでも見れます。例えばMySQL5.6なら↓

MySQL5.6の予約語



CakePHP3で予約語を使うには?

CakePHP3を使う場合、カラムに予約語を使っていると、データの登録時などにエラーが発生することがあります。

configフォルダの中にあるapp.phpにデータベースの接続設定が記述されていますが、その中に「quoteIdentifiers」という項目があります。これがfalseだと、予約語が使えない状態になります。使いたいのであれば、trueにする必要があります。

//app.php
'Datasources' => [
  'default' => [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'username' => 'my_app',
    'password' => 'sekret',
    'database' => 'my_app',
    'encoding' => 'utf8',
    'timezone' => 'Tokyo/Asia',
    'cacheMetadata' => true,
    'quoteIdentifiers' => true,//←これ
  ]
],

基本的には問題ないのですが、trueにするとパフォーマンスが低下するらしいです。

データベースの基本

予約語を使わずに済むならそれに越したことはないってことなんでしょうけど、でも既存のサイトをCakePHP3に乗り換える場合は、使わざるを得ないこともあるかもしれません。そんなときはここを書き換えましょう。パフォーマンスは……まあ、しょうがねーよ。そういうときもあるさ。






今日は以上っす。最近やたらと長〜い記事ばっかりになっちゃったから、たまには手を抜く……じゃなくって、こういう小さいポイントも突いていかないとね。

次回も短めの更新になる良いなぁ。

しかし、あのちょんちょん、グレイヴアクセントって言うんだな。初めて聞いたかも?



その他のCakePHP3を触ってみましたの記事はこちら
まとめという名の箸休め

まだコメントはいただけてないみたい……
もしかしたら何か関連しているかも?