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

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

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

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

Q&A

解決済

2回答

26337閲覧

CakePHP3でのContainに条件を含める

arsro

総合スコア24

CakePHP

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

1グッド

4クリップ

投稿2016/02/05 04:47

タイトルの通りなのですが、CakePHP3で、Containに条件を含めて
複数のテーブルの中から条件にあったものだけを取得したいです。

php

1 7class TableA extends Table{ 2 8 3 9 public function initialize(array $config){ 410 511 $this->hasMany('relation', [ 612 'className' => 'Relations', 713 'foreignKey' => 'id', 814 ]); 915 } 1016}

php

1public function getRelationController{ 2 3 //(省略) 4 5 268 $table = TableRegistry::get('tableA'); 6 269 $relation = TableRegistry::get('relation'); 7 270 8 271 $query = $table->find() 9 272 ->where([ 10 273 'location BETWEEN :min_lon AND :max_lon', 11 275 ])//条件1 12 276 ->bind(':min_lon',$x2) 13 277 ->bind(':max_lon',$x1) 14 280 ->order(['tableA_id'=>'DESC']) 15 281 ->contain(['relation'=> function ($q) use ($user_id) { 16 282 return $q 17 283 ->where(['relation.user_id' => $user_id]);//条件2 18 284 }]) 19 285 ->limit(10)->offset($offset); 20 21 //(省略)

こうした場合最初のwhereでかけた条件に引っ掛かったものが取り出されてしまいます。
本来は、
【”tabelA”テーブルに対する条件1を満たし、かつ"relation"テーブルに対する条件2を満たす】
といったものだけを10件ずつ取得したいです。

なにかありましたら随時補足させていただきますので、よろしくお願い致します。

ShoheiTai👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

containを使うとleft joinになるのですが、matchingを使うとinner joinしてくれます。
h_chicKerさんのコードで、containをmatchingに変更するだけです。

以前okinaka3さんの方法で私も試したことがあるのですが、エラーになってしまったので、諦めてしまいました。
ですので、okinaka3さんの方法を試されて万が一できない場合を考え、念のためにmatchingを使う方法があることも述べさせて頂きます。

PHP

1$query = $table->find() 2 ->where([ 3 'location BETWEEN :min_lon AND :max_lon', 4 ])//条件1 5 ->bind(':min_lon',$x2) 6 ->bind(':max_lon',$x1) 7 ->order(['tableA_id'=>'DESC']) 8 ->matching('relation', function ($q) use ($user_id) { 9 return $q 10 ->where(['relation.user_id' => $user_id]);//条件2 11 }) 12 ->limit(10)->offset($offset);

投稿2016/02/05 22:05

coba-coba

総合スコア1409

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

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

0

条件1と2を併記すればよいと思います。

php

1$query = $table->find() 2->where(['location BETWEEN :min_lon AND :max_lon'])//条件1 3->bind(':min_lon',$x2) 4->bind(':max_lon',$x1) 5->order(['tableA_id'=>'DESC']) 6->contain(['relation']) 7->where(['relation.user_id' => $user_id]);//条件2 8->limit(10)->offset($offset);

投稿2016/02/05 05:56

okinaka3

総合スコア304

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問