発生したエラー
クエリビルダを使用してupdate文を作成した時に以下のエラーが発生しました。(コードは以下の通り)やりたかったことはorderカラムの値のアップデートです。
$this->getQueryBuilder()
->update('my_table')
->set([
'order' => xx,
])
->where(['id' => xx])
->execute();
このコードを実行すると以下のエラーが吐かれました。
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'order = 'xx' WHERE id = 'xx'' at line 1 in ...\vendor\cakephp\cakephp\src\Database\Statement\MysqlStatement.php:39
調査と原因
実際に実行されていたSQLは以下のものでした。
UPDATE my_table SET order = :c0 WHERE id = :c1
原因はカラム名のorderがMySQLで予約されている単語のため、エラーとなっていました。
解決
まず試したことは、予約語を使用する時はMySQLだとバッククォートで囲うと実行できることが以下のサイトから分かったので試してみました。
https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0170
しかし実行結果はエラーでした。orderが消えてしまった・・
"UPDATE my_table SET = :c0 WHERE id = :c1"
次に以下のようにカラム名の前にテーブル名を指定してあげると問題なく実行できました。
$this->getQueryBuilder()
->update('my_table')
->set([
'my_table.order' => xx,
])
->where(['id' => xx])
->execute();
所感
・MySQLの予約語をカラムに使用しているケースに初めて遭遇したので学びになりました。
・自分がテーブル設計する時はカラム名に予約語を使用するのは、避けようと思います。