質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

2回答

9583閲覧

【cakePHP3】クエリビルダでSELECT * したい【JOIN】

HelloWorld2

総合スコア32

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2018/10/04 07:57

編集2018/10/05 02:43

概要

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`, 4567 /*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.

疑問点と試行錯誤

  1. test_2のテーブルクラスは作成する必要ありますか?(作成してみましたが、上記と同じエラーメッセージ)
  2. test_2にinitializeメソッドは必要ですか?(作成してみましたが、上記と同じエラーメッセージ)
  3. Entityクラスは作成する必要がありますか?また、クラス内で何か記述する必要はありますか?(クラス内が空のEntityは作成してみましたが、上記と同じエラーメッセージ)
  4. containが記載されていれば、joinは記載する必要はありますか?(記載してもしなくても上記と同じエラーメッセージ)

エラーの解決もとより、ファイルや記述は何が必要で何が不要か不明な状態です。

理解が浅くて申し訳ございませんが、お付き合いいただけると幸いです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

hasOne定義後のfindしているコードを載せないとなんとも言えません。

投稿2018/10/16 14:04

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

数百カラムをすべて select するんですか?
なんでそういうことしなきゃならないのか設計を見直すべきではないかとは思いますが……

さて CakePHP の ORM は、join したものをいきなり取り出したりしないようになっています。(select で明示的に指定していれば当然取り出しますが)
https://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html#contain

同時に取り出したければ contain で指定してください。

PHP

1$this->test_1->find() 2 ->join([ 3 ... 4 ]) 5 ->where([ 6 'id' => $id 7 ]) 8 ->contain(['test_2', 'test_3']) 9 ->first();

以下、追記部分への追加

test_2, test_3 とも、Entity, Table を構築しなければなりません。手作業で作成するのではなく、bin/cake bake を利用して、作らせるのがよいです。

投稿2018/10/04 08:04

編集2018/10/05 04:01
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HelloWorld2

2018/10/04 08:41

ご回答ありがとうございます。サイトも見てやってみたのですが、エラーが発生しました。「Call to undefined method Cake\ORM\Entity::contain() 」別途ライブラリの読み込み等が必要なのでしょうか?Cake\ORM\TableRegistryは読み込んでいますが・・・(初歩的な質問、すみません)
tacsheaven

2018/10/04 08:44

->first() する前でなきゃ駄目でしたね。->where() の後、->first() の前に移動させてみてください
tacsheaven

2018/10/04 09:41

はい。ORM が関係性を認識できていない(ORM のデフォルト名称に合っていないから)からですね。
HelloWorld2

2018/10/05 02:24 編集

ありがとうございます。試行錯誤したのですが、エラーが解決しないため、補足で追記に関し、ご回答頂けると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問