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

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

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

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

Q&A

2回答

4837閲覧

cakephp3 アソシエーションの設定におけるカラム名の明示的な設定について

Shinroh

総合スコア61

CakePHP

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

0グッド

1クリップ

投稿2016/03/23 07:45

編集2016/03/23 07:48

テーブルクラス内にアソシエーションの設定をする場合に、"テーブル名_id"の形式の場合は規約に従ってアソシエーションの設定がされますが、明示的に"***_id" 以外の形式のカラムと紐づける場合にはどのように記述すればよいのでしょか。

Themes.staffs_template = Templates.id
Themes.talks_template = Templates.id
のように「テーマ」テーブルの●●テンプレートカラムとテンプレートマスタのIDを紐づけたいです。

ThemesTable.php

php

1$this->belongsTo('Templates', [ 2 'foreignKey' => 'staffs_template', 3 'joinType' => 'INNER' 4]);

よろしくお願いします。

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

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

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

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

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

guest

回答2

0

第1引数はアソシエーションの名前です。そのまま Theme エンティティーのフィールド名になります(ただし lower_snake 単数形)。

[ThemesTable]

php

1$this->belongsTo('StaffsTemplates', [ 2 'foreignKey' => 'staffs_template_id', 3 'className' => 'Templates', 4 'joinType' => 'INNER' 5]); 6$this->belongsTo('TalksTemplates', [ 7 'foreignKey' => 'talks_template_id', 8 'className' => 'Templates', 9 'joinType' => 'INNER' 10]);

[ThemesController]

php

1$theme = $this->Themes->get($id, [ 2 'contain' => ['StaffsTemplates', 'TalksTemplates'] // アソシエーション名を指定 3]); 4debug($themes); /* 5object(App\Model\Entity\Theme) { 6 'id' => (int) 1, 7 'staffs_template_id' => (int) 2, 8 'talks_template_id' => (int) 1, 9 'talks_template' => object(App\Model\Entity\Template) { 10 'id' => (int) 1, 11 }, 12 'staffs_template' => object(App\Model\Entity\Template) { 13 'id' => (int) 2, 14 }, 15} 16*/// …みたいな構造が返ってくる

ちなみに cake 上で変数を出すなら debug 関数が超絶便利です。(layoutなどの環境にもよりますが)

投稿2016/03/23 14:25

tozjp

総合スコア790

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

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

tozjp

2016/03/23 14:30

> (ただし lower_snake 単数形) many 系アソシエーションの場合は複数形のままだったかもしれません。ほんと頭いい。
Shinroh

2016/03/24 01:02

ありがとうございます。試してみます。 結果はまた報告しますね。
guest

0

PHP

1// モデル 2public $primaryKey = '紐付けたいカラム名';

で主キーを切り替えれます。
戻るのを忘れないように!

投稿2016/03/23 08:15

編集2016/03/23 08:19
test0001

総合スコア224

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

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

Shinroh

2016/03/23 09:12 編集

すみません、もう少し具体的にどのように使うかを教えていただけないでしょうか…。 経験不足で申し訳ありません…。 少しCookbookで調べて、ThemesTable.phpに以下のように書いたのですが、 $this->belongsTo('Templates', [ 'className' => 'Templates', 'foreignKey' => 'staffs_template', "bindingKey" => "id", 'joinType' => 'INNER', 'propertyName' => 'staffs_template' ]); $this->belongsTo('Templates', [ 'className' => 'Templates', 'foreignKey' => 'talks_template', "bindingKey" => "id", 'joinType' => 'INNER', 'propertyName' => 'talks_template' ThemesController.phpから以下のように書いてやると、 $themes = $this->Themes->get($id, ["contain" => ["Templates"]]); var_dump($themes); themes.staffs_template => 1 (取得したいtemplate.idの値が保存されていてそのまま出力された) themes.talks_template => templateのエンティティオブジェクト IDの異なる一つのエンティティクラスを複数返すようなアソシエーションの設定はできないんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問