概要
cakePHP3のクエリビルダを用いて、SQL文を発行しようとしています。
発行したいSQLは下記の通りです。
課題は、joinしたテーブルのカラムが取得できないことです。
(下記コードの、test_2、test_3のカラムが取得できない)
発行したいSQL
mysql
1SELECT * 2FROM test_1 3INNER JOIN test_2 4 ON test_1.id = test_2.parent_id 5INNER JOIN test_3 6 ON test_1.id = test_3.parent_id 7WHERE test_1.id = $id/*パラメータ、今回は'5'とする*/ 8LIMIT 1
現状
上記SQLを発行するため、下記コードを作成しました。
cakePHP3
1$this->test_1->find() 2 ->join([ 3 'test_2' => [ 4 'table' => 'test_2', 5 'type' => 'INNER', 6 'conditions' => 'test_2.parent_id = test_1.id', 7 ], 8 'test_3' => [ 9 'table' => 'test_3', 10 'type' => 'INNER', 11 'conditions' => 'test_3.parent_id = test_1.id', 12 ] 13 ]) 14 ->where([ 15 'id' => $id 16 ]) 17 ->first() 18 ;
結果として下記SQLが発行されました。
result
1SELECT 2 test_1.id AS `test_1__id`, 3 test_1.name AS `test_1__name`, 4 ・ 5 ・ 6 ・ 7 /*test_1の全カラムが出力されております*/ 8 /*test_2、test_3のカラムは出力されておりません*/ 9FROM 10 test_1 test_1 11 INNER JOIN test_2 test_2 ON test_2.parent_id = test_1.id 12 INNER JOIN test_3 test_3 ON test_3.parent_id = test_1.id 13WHERE 14 id = 5 15LIMIT 1
test_2、test3のカラムを取得するにはどうすればよいのでしょうか。
find('all')にしても変化はありませんでした。
また、参考サイトのように作成すると、エラーが出力されました。(単にcakePHPのバージョンの問題だと思います・・・)
計数百カラムあるので、select()内で、1つ1つカラムを指定する方法はNGです。
よろしくお願いします。
補足
アソシエーション定義
定義を作成してみましたが、うまくいきません。
php
1namespace App\Model\Table; 2 3use Cake\ORM\Table; 4 5class test_1Table extends Table 6{ 7 public function initialize(array $config) 8 { 9 $this->hasOne('test_2') 10 -> setJoinType('INNER') 11 -> setForeignKey('parent_id') 12 -> setBindingKey('id') 13 ; 14 /*配列で記載しても変わらず 15 $this->hasOne('cmp_tran_purpose',[ 16 'joinType' => 'INNER', 17 'foreignKey' => 'parent_id', 18 'bindingKey' => 'id' 19 ]); 20 */ 21 } 22}
エラーメッセージ
The test_2 association is not defined on test_1.
疑問点と試行錯誤
- test_2のテーブルクラスは作成する必要ありますか?(作成してみましたが、上記と同じエラーメッセージ)
- test_2にinitializeメソッドは必要ですか?(作成してみましたが、上記と同じエラーメッセージ)
- Entityクラスは作成する必要がありますか?また、クラス内で何か記述する必要はありますか?(クラス内が空のEntityは作成してみましたが、上記と同じエラーメッセージ)
- containが記載されていれば、joinは記載する必要はありますか?(記載してもしなくても上記と同じエラーメッセージ)
エラーの解決もとより、ファイルや記述は何が必要で何が不要か不明な状態です。
理解が浅くて申し訳ございませんが、お付き合いいただけると幸いです。
よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。