🐘

CakePHP2で、HABTMの中間テーブルにtablePrefixを付ける方法

2013/06/20に公開

$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',
    :
    :

これで機嫌よく動いてくれるでしょう。

GitHubで編集を提案

Discussion