🐘
CakePHP2で、HABTMの中間テーブルにtablePrefixを付ける方法
$tablePrefix
CakePHP2 では、モデルクラスで $tablePrefix を指定することで、テーブル名にプレフィックスを付けて動作させることが出来ます。
例)
<?php
// Sample.php
class Sample extends AppModel {
public $tablePrefix = 'prefix_';
テーブル名 | コントローラクラス名 | モデルクラス名 |
---|---|---|
prefix_samples | SamplesController | Sample |
case of HABTM
しかし、HABTM(HasAndBelongsToMany=多対多)の中間テーブルにもプレフィックスを付けたい場合は、$tablePrefix を指定しただけでは動作しません。
これだけだとダメ
<?php
// Sample.php
class Sample extends AppModel {
public $tablePrefix = 'prefix_';
<?php
// Test.php
class Test extends AppModel {
public $tablePrefix = 'prefix_';
<?php
class SamplesTest extends AppModel {
public $tablePrefix = 'prefix_';
テーブル名 | コントローラクラス名 | モデルクラス名 |
---|---|---|
prefix_samples | SamplesController | Sample |
prefix_tests | TestsController | Test |
prefix_samples_tests | SamplesTestsController | SamplesTest |
中間テーブルのテーブル名は、実は $hasAndBelongsToMany アソシエーション定義の joinTable キーにハードコードされています。普通に bake しただけの状態だとプレフィックスなしのテーブル名が書かれているでしょう。
中間テーブルのテーブル名にもプレフィックスを付けたい場合は、ここも書き換えておく必要があります。
これも必要
<?php
// Sample.php
public $hasAndBelongsToMany = array(
'Test' => array(
'className' => 'Test',
'joinTable' => 'forum_samples_tests',
'foreignKey' => 'sample_id',
'associationForeignKey' => 'test_id',
:
:
<?php
// Test.php
public $hasAndBelongsToMany = array(
'Sample' => array(
'className' => 'Sample',
'joinTable' => 'forum_samples_tests',
'foreignKey' => 'test_id',
'associationForeignKey' => 'sample_id',
:
:
これで機嫌よく動いてくれるでしょう。
Discussion