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

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

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

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

Q&A

解決済

1回答

3352閲覧

cakephp3で複数テーブルから条件に合ったレコードを呼び出したい

tarao

総合スコア28

CakePHP

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

0グッド

0クリップ

投稿2017/04/19 02:34

cakephp3を使用して、3つのテーブルから条件が一致するものを全て呼び出したいのですが、データベースをくっつける設定のところからわからないので、ご教示お願いします。

商品購入のログなのですが、商品とオプションとチップに分けてログを登録しています。
メインはserveicesテーブルで共通部分は、seller/op_seller/c_sellerの出品者idと
room_nob/op_room_nob/c_room_nobの商品ナンバーです。

$seller="aaa"; $purch_nob="12345";

上記の変数に入った値と一致するレコードを全て表示させたいのです。

serveices | id | seller | buyer | room_nob | title | money | 1 | aaa | bbb | 12345 | イラスト | 3000 | 2 | ccd | hhh | 45632 | ロゴ制作 | 4000 options | id | op_seller | op_buyer | op_room_nob | op_title | op_money | 1 | aaa | bbb | 12345 | 色付 | 500 | 2 | aaa | bbb | 12345 | 加工 | 500 | 3 | aaa | bbb | 12345 | 背景 | 1000 | 4 | aaa | bbb | 12345 | 商用利用削除 | 2000 | 5 | ccd | hhh | 45632 | 修正 | 1000 | 6 | ccd | hhh | 45632 | 商用利用削除 | 2000 chips | id | c_seller | c_buyer | c_room_nob | c_title | c_money | 1 | aaa | bbb | 12345 | チップ | 500 | 2 | ccd | hhh | 45632 | チップ | 100 | 3 | aaa | bbb | 12345 | チップ | 1000

他のサイトを見ながら記述したのですが、Unknown method "matching"のエラーになってしまいます。

php

1 $serveices=TableRegistry::get('serveices');//購入履歴 2 $options=TableRegistry::get('options');//オプション購入履歴 3 $chips=TableRegistry::get('chips');//チップ履歴 4 5 $seller="aaa"; 6 $purch_nob="12345"; 7 8 $serveices->matching('Options', function (Query $q) use ($seller) { 9 return $q->where(['Options.op_seller IN' => $seller]); 10 11 })->matching('Chips', function (Query $q) use ($seller) { 12 return $q->where(['Chips.c_seller IN' => $seller]); 13 14 });

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

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

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

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

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

guest

回答1

0

ベストアンサー

やりたいことはアソシエーションだと思いますので、マニュアルをよく読んで設定してみてください。

なお、共通するカラムが複数ある(複合キー)なのが気になりますね... 特別な理由がないなら採番したID(サロゲートキー)を使った方が設定が楽かもしれません。

投稿2017/04/19 05:36

popobot

総合スコア6586

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

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

tarao

2017/04/19 09:09 編集

回答ありがとうございます。 マニュアルを読んでいたのですが、どこでどうしてるのかなかなか理解ができなくて... ひとまずつなげるだけつなげてみようと思いやってみたのが↓ class ServeicesTable extends Table { public function initialize(array $config) { $this->hasMany('Options'); $this->hasMany('Chips'); } } メインとなるserveicesテーブルに上記を記述して、下記をphpに記述しました。 $serveices=TableRegistry::get('serveices'); $query = $serveices->find(); $data = $query -> find('all',[ 'contain'=>['Options','Chips'] ]); debugで$dataを確認したところ融合されたのはされたのですが、 きちんと理解できていないため、取り出し方がわかりません。 foreachだとColumn not foundのエラーが出てしまいます。 'foreignKey' => 'op_room_nob' 'foreignKey' => 'c_room_nob' をそれぞれつけたところ、foreachで表示できましたが、$serveicesの中身しか取り出すことができませんでした。 foreignKeyで指定したものがserveicesテーブルから参照できるとういうことなのでしょうか??
popobot

2017/04/19 10:55

正しくアソシエーションが設定されていれば、optionsとchipsのデータも取得できるはずです。 たぶんforeingKeyとbindingKeyの設定が必要です(複合キーが使えないかもしれません) もしくはoptionsとchipsそれぞれにservice_idという外部キーを追加すれば、特に設定は不要です。
tarao

2017/04/21 13:38

コメントありがとうございます! なかなか思い通りにいかず時間がかかってしまいました。 'defaultTypes' => [ 'serveices.id' => 'integer', 'id' => 'integer' ] bindingKeyも記述して、上記のように表示されるので、あと少し何かが違うだけだと思うのですが、foreachを使うとDatabase Errorが出てしまっています。 今回は急ぎだったので、unionを使いsqlで呼び出すことにしました。 もう少しいろいろ試してみたいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問