Ticket #71 (closed 要望/提案: fixed)

Opened 2 years ago

Last modified 2 years ago

テーブル名がすべて大文字英字だった場合への対応

Reported by: kumatch Owned by: iteman
Priority: major Milestone: 1.0.0
Component: 01: マッパー Version: The Latest Version of 1.0
Keywords: Cc:
Blocking: Blocked By:

Description

現在のところ、参照しようとするテーブルの名称がすべて大文字の英字だった場合、マッパー名からのテーブル名変換がうまくいかず参照に失敗する。

以下のパッチを適応することで、マッパー名指定がすべて大文字英字だった場合はstrtolowerしないよう振舞うことで問題は回避できる。

ただしこのパッチでは、大文字と小文字が入り乱れるテーブル名だった場合に対応できない。
全般的に対応するのであれば、getMapper() 第2引数として名称の変換是非フラグを付与させるような方法が考えられる。

--- ORM/Inflector.php
+++ ORM/Inflector.php
@@ -101,9 +101,15 @@
      */
     function underscore($word)
     {
-        return strtolower(preg_replace('/[^A-Z^a-z^0-9]+/', '_',
-                                       preg_replace('/([a-z\d])([A-Z])/', '\1_\2',
-                                                    preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1_\2', $word))));
+        $word = preg_replace('/[^A-Z^a-z^0-9]+/', '_',
+                             preg_replace('/([a-z\d])([A-Z])/', '\1_\2',
+                                          preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1_\2', $word)));
+
+        if (preg_match('/^[A-Z0-9_]+$/', $word)) {
+            return $word;
+        } else {
+            return strtolower($word);
+        }
     }

     // }}}

Change History

Changed 2 years ago by iteman

  • status changed from new to assigned

Changed 2 years ago by iteman

  • milestone set to 1.0.0

基本的な問題としてRDBMSによってテーブル名の大文字/小文字の取り扱い方法は異なるということがある。

PostgreSQL
テーブル名をダブルクォートで括ることで大文字/小文字を区別することができる
MySQL
OSおよびファイルシステム、lower_case_table_namesシステム変数によって挙動が異なる
SQL Server
指定された照合順序による

ORMのレイヤとしては、Piece_ORM設定ファイルに対してDSN毎にテーブル名の大文字/小文字を区別するかどうかを設定することによる対応を考えたい。具体的にはマッパー定義ファイル名をそのままテーブル名として使うというオプションを提供する。このオプションが有効であり、RDBMSがPostgreSQLの場合、自動生成されるSQLに含まれるテーブル名をダブルクォートで括る必要がある。

このオプションの影響を受ける箇所は下記のとおり。

参考URI:

Changed 2 years ago by iteman

  • status changed from assigned to closed
  • resolution set to fixed

最終的にpiece-orm-config.yamlの各データベース設定でuseMapperNameAsTableNameをtrueにすることでマッパー名をそのままテーブル名として使うようになった。詳細はチェンジセット336を参照のこと。

Note: See TracTickets for help on using tickets.