なんか面白そうだったのでやってみました。
ちなみにこちらの実行環境は、Nginx 10.0.2 / PHP 7.1.0 / CakePHP 2.8.9 / MySQL 5.7.17 となっています。
結論から言うと、parent::__construct();
が足りないだけだと思います。
モデル:Apple.php
PHP
1<?php
2App::uses('AppModel', 'Model');
3class Apple extends AppModel {
4 public $useTable = 'Apple';
5
6 public function __construct($tableName) {
7 $this->useTable = $tableName;
8 //ココが肝心 useTableを入れ替えてからAppModel(親クラス)のコンストラクタをコールする
9 parent::__construct($tableName);
10 }
11}
コントローラ:AppleController.php
php
1class AppleController extends AppController {
2 public function AppleTest() {
3 $this->autoLayout = false;
4 $this->autoRender = false;
5
6 //Controllerの$uses配列に入れるとテーブル名の差し替えが出来ないので、個別にインスタンスを作る。その為の読み込み
7 App::uses('Apple', 'Model');
8 //インスタンス化。ここでインスタンス化するテーブル名を指定
9 $this->Apple = new Apple('a1_apple');
10
11 echo 'a1_apple: ';
12 //find all した結果を出力してみる
13 echo var_export($this->Apple->find('all'), true).'<br>'.PHP_EOL;
14 //getLogも見てみる
15 echo var_export($this->Apple->getDataSource()->getLog(), true).'<br>'.PHP_EOL;
16
17
18 //インスタンスを別テーブルに切り替え
19 $this->Apple = new Apple('a2_apple');
20
21 echo 'a2_apple: ';
22 echo var_export($this->Apple->find('all'), true).'<br>'.PHP_EOL;
23 echo var_export($this->Apple->getDataSource()->getLog(), true).'<br>'.PHP_EOL;
24 }
25}
データ:a1_apple
データ:a2_apple
id | name |
---|
1 | a2_1 |
2 | a2_2 |
3 | a2_3 |
4 | a2_4 |
こちらで実行すると、以下のような出力となりました。
txt
1a1_apple: array (
2 0 => array (
3 'apple' => array (
4 'id' => '1',
5 'name' => 'a1_1',
6 ),
7 ),
8 1 => array (
9 'apple' => array (
10 'id' => '2',
11 'name' => 'a1_2',
12 ),
13 ),
14)
15array (
16 'log' => array (
17 0 => array (
18 'query' => 'SELECT `apple`.`id`, `apple`.`name` FROM `ca`.`a1_apple` AS `apple` WHERE 1 = 1',
19 'params' => array ( ),
20 'affected' => 2,
21 'numRows' => 2,
22 'took' => 0.0,
23 ),
24 ),
25 'count' => 1,
26 'time' => 0.0,
27)
28
29a2_apple: array (
30 0 => array (
31 'apple' => array (
32 'id' => '1',
33 'name' => 'a2_1',
34 ),
35 ),
36 1 => array (
37 'apple' => array (
38 'id' => '2',
39 'name' => 'a2_2',
40 ),
41 ),
42 2 => array (
43 'apple' => array (
44 'id' => '3',
45 'name' => 'a2_3',
46 ),
47 ),
48 3 => array (
49 'apple' => array (
50 'id' => '4',
51 'name' => 'a2_4',
52 ),
53 ),
54)
55array (
56 'log' => array (
57 0 => array (
58 'query' => 'SELECT `apple`.`id`, `apple`.`name` FROM `ca`.`a2_apple` AS `apple` WHERE 1 = 1',
59 'params' => array ( ),
60 'affected' => 4,
61 'numRows' => 4,
62 'took' => 0.0,
63 ),
64 ),
65 'count' => 2,
66 'time' => 0.0,
67)
コツとしては、Modelの__constructにて、parent::__construct();
を行う前に$this->useTable = $tableName;
を行う事ですかね。
こうする事で、書き換わったuseTableを使って、親クラスであるAppModelのコンストラクタを動かす事が出来ます。