kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Phalconでテーブル名のアンダーバーは無視される

昨日に引き続き Phalcon Developer Toolsの話で,user_table みたいなテーブル名にアンダーバーを含んだテーブルを扱おうとしてかなりはまったのでまとめておく.結論としては Phalcon ではアンダーバーを無視する仕様とのこと.

まずは phalcon model してみる

Phalcon Developer Tools — Phalcon 1.2.4 documentation #Getting Available Commands
Phalcon Developer Tools — Phalcon 1.2.4 documentation #Generating Models

その前に,Phalcon コマンドのリストがマニュアルと異なっているので,そこから紹介しておくと,create-modelエイリアスmodel が用意されてるし,オプション --table-name はもうなくて --name に変更されてるけど,別にオプション指定じゃなくても良いので,特に使わないはず.

$ phalcon commands

Phalcon DevTools (1.2.4)

Available commands:
  commands (alias of: list, enumerate)
  controller (alias of: create-controller)
  model (alias of: create-model)
  all-models (alias of: create-all-models)
  project (alias of: create-project)
  scaffold
  migration
  webtools

ということで,改めて phalcon model をしてみる.

$ phalcon model user_table
Phalcon DevTools (1.2.4)
  Success: Model "user_table" was successfully created.  

どうなったかと言うと,アンダーバーは無視されて user_table から UserTable.php が自動生成される.

$ ls -1 app/models
UserTable.php

PHQL で簡単なクエリを投げてみる

Working with Models — Phalcon 1.2.4 documentation
Phalcon Query Language (PHQL) — Phalcon 1.2.4 documentation

動作確認のため ORM じゃなく,あえて PHQL で簡単なクエリを投げてみた.

こんな感じで書いてみると,user_table がロードできないというエラーが出てしまう.

require dirname(__DIR__) . '/models/UserTable.php';
(中略)
$query = $this->di->get("modelsManager")->createQuery("select * from user_table");
$users = $query->execute();
foreach ($user as $users) {
    echo $user->id;
}
Phalcon\Mvc\Model\Exception: Model 'user_table' could not be loaded

解決策はこうで,PHQL でもアンダーバーを無視したテーブル名で参照する必要がある.ようするに from usertable となる.でもこれだと単独のSQLとしては使えず,テーブルが存在しないとかそういうエラーが出る.障害時とか急いでるときほどソースを読んで解析したりするので,これじゃ微妙だなー.テーブル名にアンダーバー使うのやめようかなー.どうしようかなーって感じ.

require dirname(__DIR__) . '/models/UserTable.php';
(中略)
$query = $this->di->get("modelsManager")->createQuery("select * from usertable");
$users = $query->execute();
foreach ($user as $users) {
    echo $user->id;
}

Phalcon 的には "It's the convention." とのこと

まさに同じ議論が GitHub の issue で行われていて,この挙動はバグではなく仕様とのこと.ということで,この人が提案してる通り,まずはマニュアルに書いておいて欲しいというのに同意.ただ Phalcon のマニュアルって充実してるのと同時にかなり膨大で複雑なので全体を把握するのが結構大変なイメージがある.

[ BUG ] Models with underscores · Issue #963 · phalcon/cphalcon · GitHub
Mention how Models get mapped to tables · Issue #143 · phalcon/docs · GitHub

まとめ

Phalcon 初心者なこともあって結構はまった.まったくもー.

関連エントリー

phalcon model すると Database configuration cannot be loaded ってエラーが出る - kakakakakku blog