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

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

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

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

Q&A

解決済

1回答

2844閲覧

CakePHP3のアソシエーションについて

ssk

総合スコア332

CakePHP

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

0グッド

0クリップ

投稿2017/03/06 10:27

編集2017/03/07 03:14

######説明
dalテーブルに、dal_listテーブルとdal_dataテーブルをJoinしたいのですが、cakephp3のアソシエーションを利用すればもっと簡単にできるような気がして、、、以下の方法で3テーブルをjoinしているのですが、他に良い方法はないでしょうか?

PHP

1$query = $this->Hoges->find() 2 ->where(['status' => 1]) 3 ->order(['Hoges_id' => 'DESC']) 4 ->join([ 5 'table' => 'Dallists', 6 'type' => 'LEFT', 7 'conditions' => 'Dallists.hoges_id = Dallists.id', 8 ]) 9 ->join([ 10 'table' => 'Daldatas', 11 'type' => 'LEFT', 12 'conditions' => 'Daldatas.dal_id = Dallists.dal_id', 13 ]);

hogesテーブル

idname
1テキストテキスト
2テキストテキスト
3テキストテキスト

dallistsテーブル

idhoges_iddata_id
122
254
313

daldatasテーブル

data_idname
1テキストテキスト
2テキストテキスト
3テキストテキスト
4テキストテキスト
5テキストテキスト

######追記
hogesテーブルのidがdallistsテーブルのhoges_idと紐づいています。

dallistsテーブルのdata_idがdaldatasテーブルのata_idと紐づいています。

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

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

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

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

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

popobot

2017/03/06 13:37 編集

説明とコードとテーブル一覧の名前が全部バラバラです。各テーブルがどういった関係なのかが正しくわからないとどのアソシエーションが使えるかもわかりません。
ssk

2017/03/07 03:14

申し訳ございませんでした。質問内容を修正・追記いたしました。
guest

回答1

0

ベストアンサー

テーブルの構造からn:nの関係性のように見えるのでbelongsToManyとかを使えばいいと思います。カラム名が規約と違うので少し追加の設定が必要です。

php

1<?php 2namespace App\Model\Table; 3 4use Cake\ORM\Table; 5 6class HogesTable extends Table { 7 8 public function initialize(array $config) { 9 $this->belongsToMany('Daldatas', [ 10 'joinTable' => 'dallists', 11 'foreignKey' => 'hoges_id', 12 'targetForeignKey' => 'data_id', 13 ]); 14 } 15 16}

コントローラからは以下のようにすれば使えます。

php

1$hoges = $this->Hoges->find()->contain('Daldatas')->all();

なお、元のSQLは単にLEFT JOINを2回しているので、結果の構造は少し違います。

アソシエーションについては、マニュアルに詳しく書いてあるのでよく読んで色々試してみてください。

投稿2017/03/07 03:52

popobot

総合スコア6586

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

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

ssk

2017/03/07 04:57

'targetForeignKey' ↑こちらの存在を初めて知りました。解決できそうです。 ご回答、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問