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

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

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

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

Q&A

解決済

1回答

4716閲覧

CakePHPで孫アソシエーションの条件を指定して検索したい。

hjo

総合スコア13

CakePHP

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

0グッド

0クリップ

投稿2018/09/24 12:11

編集2018/09/24 12:16

前提・実現したいこと

CakePHP3.6.5を使用して商品購入システムを作っています。

Purchases->PurchaseDetails->ExhibitDetails->Products->Standsという構造の、
standsテーブルにあるidを指定してPurchasesモデルを取得することは可能でしょうか?

・PurchasesTableテーブルでは、からhasManyでPurchaseDetailsモデルにアソシエーション設定
・PurchaseDetailsTableでは、belongsToでExhibitDetailsモデルにアソシエーション設定
・ExhibitDetailsでは、belongsToでProductsモデルにアソシエーション設定
・Productsでは、belongsToでStandsモデルにアソシエーション設定

以下のソースですと、Database Errorが表示されてしまいます。
where句の指定の方法に問題があると思うのですが、ご教授お願いいたします。

初めての投稿で、CakePHP初心者のため勉強不足のことろもあり、不足な部分があるかと思いますがよろしくお願いします。

発生している問題・エラーメッセージ

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.Stands.id = '10')' at line 1

該当のソースコード

PHP

1$purchases = $this->Purchases->find('all')->where 2    (['PurchaseDetails.ExhibitDetails.Products.Stands.id' => $selectId])->contain 3    (['PurchaseDetails' => ['ExhibitDetails' => ['Products' => ['Stands']]]]);

試したこと

where句のところを、Stands.idにしてもダメでした。

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

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

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

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

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

m.ts10806

2018/09/24 12:48

SQLのエラーのようですが、実際に実行されたSQLを確認してみました?動的に作られるものは意図通りになっているか確認されたほうが良いです。(もちろんその前に静的に作っておくことは必須ですが)
guest

回答1

0

ベストアンサー

containを使った場合、hasManyは、別SQLとして実行されるため、where句で条件に使うことはできないません(上記のエラーはそれ以前に、where句の指定の仕方がおかしいためSyntax errorになっていますが)

machingを使えばできると思います。マニュアルにも Shops.Cities.Countries という多段なアソシエーションの例も記載されていますので、参考にしてください。

なお、マニュアルに注記されていますが、「この機能は INNER JOIN 句を生成しますので、条件によりすでに除外していない限り、 取得した行が重複しているかもしれず、find クエリーでは distinct の呼び出しを考えたいことでしょう。 これは、たとえば、同じユーザーが一つの記事 (Article) に複数回コメントした場合にありえます」ので気をつけてください。DebugKitなどで実際に実行されるSQLが想定したものになっているかは確認するといいと思います。

投稿2018/09/24 21:24

popobot

総合スコア6586

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

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

hjo

2018/09/25 10:01

hasManyは、別SQLとして実行されるのですね。matchingを使用したところ、絞り込みができました。 勉強になります。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問