« PreviousNext »

Entry

CakePHPで多言語(多国語)対応を行う場合の注意点その2

CakePHPで多言語(多国語)対応を行う場合、翻訳ビヘイビア(TranslateBehavior)を使用して

$this->Task->Behaviors->attach('Translate', array(列名1, 列名2, ...));
$this->Task->findAll();

のようなコードを書くことになりますが、この際に

・データベースがMySQLである。
・取得するデータが複数件になる
・翻訳ビヘイビアに指定する対象列が多い

という条件が成り立つと、データ取得が非常に遅くなる(最悪の場合はMySQLがほとんどフリーズしたような状態になる)という現象が発生します。

これは、翻訳ビヘイビアによって作成されるSQL文が、i18nテーブルと実テーブルの左外部結合(LEFT JOIN)になることによるものだと思われますが、詳細な原因は不明です。

対処法としては、

・取得するデータが複数件になる場合は、翻訳ビヘイビアに指定する列名リストを2個以下にする

とすることで基本的には回避できます。よって、翻訳ビヘイビアに対して多数の列を指定するのは詳細画面(取得するデータが1件だけの画面)だけにして、一覧画面などのように複数件のデータを取得する画面では翻訳ビヘイビアに対して指定する列数は2個以下に留めるような画面仕様にする必要があるということになります。

※こういった事情があるため、データベースにMySQLを使用する場合は、モデルクラスの$actsAs変数を使用して固定的に翻訳ビヘイビアを割り当てるのではなく、上記のようにモデルを使用する各アクションで翻訳ビヘイビアをアタッチする手法にしておいた方が良いと思われます。

Page Top

« PreviousNext »