hasAndBelongsToManyは少し厄介
リレーションのための「hasAndBelongsToMany」。これは少々厄介だ。かなりトラぶったのでメモしておく。
まずこのリレーションを使おうとすると、使用する環境に注意が必要だ。環境とはすなわち、MySQLのバージョンとcakePHPのバージョンだ。cakePHPのデフォルトの記述方法だとMySQL3.23.58ではエラーが発生する(要はMySQL4で記述せよ、ということ)。
まず状況の説明。最初はMySQL3.23.58とcakePHP1.1.13.4450な環境で動作させようと試みた。しかしどうやってもリレーション先のテーブルのデータを取ってこれない。そこでMySQL5な環境で試してみたが、それでもやっぱり動かない。
ここではたと気づいた、バグがあるのでは・・・。調べてみたら賢者はいました。すばらしい。
http://cl.pocari.org/2007-04-06-2.html
ちなみにうちではcakePHP1.1.13.4450ではエラーは出なかった。それにMySQL5でもうまくいかなかった(これはテスト不足なだけかもしれない)。そこでまずcakePHP1.1.14.4797(執筆時点の最新バージョン)にアップデート(cakePHPのアップデートは簡単で、cakeディレクトリ内のファイルをごっそり入れ替えるだけ)。そうすると出ました、エラーメッセージ。ここで上記サイトに記載があるように、以下のように修正。
cake/libs/model/datasources/dbo_source.phpの1050行目
「’alias’ => $joinAssoc,」の記述があるのでその下に以下の一行を追加。
「’type’ => ‘INNER’,」
これで見事に解決した。3時間近く悩んだだけに感慨もひとしお。しかし上記ページの作者曰く「上記の修正はあくまで,hasAndBelongsToMany を使いたい場合で,そのほかの項目はあまりテストしていませんのでご注意を.」とのこと。まぁ問題が出たらその都度対応することにしよう。
貴重な情報に感謝。