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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

Q&A

解決済

2回答

3695閲覧

queryBuilderでWhere句のandとorの組み合わせ方がわからない

chi_tana

総合スコア19

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

0グッド

1クリップ

投稿2016/12/02 05:23

###前提・実現したいこと
下記のようなSQL文を作成したいと考えています。

where ( (Maps.prefecture_name = :c0 AND Maps.city_name like :c1) OR (Maps.prefecture_name = :c2 AND Maps.city_name like :c3) OR (Maps.prefecture_name = :c5 AND Maps.city_name like :c5) )

###発生している問題・エラーメッセージ
上記のようなSQLができない、for文を使うと文法が悪いのかエラーになる。
また、下記のようなSQL文になる。

WHERE ( Maps.prefecture_name = :c0 AND Maps.city_name like :c1 AND (Maps.prefecture_name = :c2 OR Maps.city_name like :c3 ) )

###該当のソースコード

php

1for文を使ったコード 2 $query = $this->Maps->find() 3 ->where( 4 for ($i = 0; $i <= count($prefecture); $i++) { 5 [ 6 'OR' =>[ 7 'Maps.prefecture_name' => $prefecture[$i], 8 'Maps.city_name LIKE' => $city[$i] 9 ] 10 ]} 11 ); 12別々に書いたコード 13 $this->set(compact('query')); 14 $query = $this->Maps->find() 15 ->where( 16 [ 17 'Maps.prefecture_name' => $prefecture[0], 18 'Maps.city_name LIKE' => $city[0], 19 'OR' =>[ 20 'Maps.prefecture_name' => $prefecture[1], 21 'Maps.city_name LIKE' => $city[1] 22 ] 23 ] 24 );

###補足情報(言語/FW/ツール等のバージョンなど)
CakePHP7

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

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

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

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

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

guest

回答2

0

ベストアンサー

orWhereに渡す条件が複数あると条件を追加する際にそれぞれOR条件になってしまうようなので、クロージャで明示的にANDにしないとダメみたいですよ。

php

1$query = $this->Maps->find(); 2for ($i = 0; $i < count($prefecture); $i++) { 3 $query->orWhere(function ($exp, $query) use ($prefecture, $city, $i) { 4 return $exp->and_([ 5 'Maps.prefecture_name' => $prefecture[$i], 6 'Maps.city_name LIKE' => $city[$i] 7 ]); 8 }); 9}

以下のように、単純に条件配列に追加して、whereに渡すやり方のほうがわかりやすいと思いました。

php

1$query = $this->Maps->find(); 2$conditions = []; 3for ($i = 0; $i < count($prefecture); $i++) { 4 $conditions['OR'][] = [ 5 'Maps.prefecture_name' => $prefecture[$i], 6 'Maps.city_name LIKE' => $city[$i] 7 ]; 8} 9$query->where($conditions);

投稿2016/12/02 15:16

popobot

総合スコア6586

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

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

guest

0

ORのキーに対する配列の値は、その中身をORとして扱います。

// 例 ->where([ 'aaaa', 'OR' => [ 'bbb', 'ccc' ] ]); // 結果 aaa AND (bbb OR ccc)

なので、この場合はorWhereを利用するとうまくいくかと思います。

$query = $this->Maps->find(); for ($i = 0; $i <= count($prefecture); $i++) { $query->orWhere([ 'Maps.prefecture_name' => $prefecture[$i], 'Maps.city_name LIKE' => $city[$i] ]); } debug($query); //確認用

余談ですが、CakePHP7 は PHP7 と CakePHP3 のことですね。

投稿2016/12/02 09:09

trashbox

総合スコア14

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

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

chi_tana

2016/12/03 04:05

PHP7とCakePHP3です、ご指摘ありがとうございます。 icchiiさんの仰るとおり、orWhereに渡す条件が複数あるとそれぞれOR条件になることを確認しました。 また、原因はわかりませんが'Maps.prefecture_name' => $prefecture[$i], の行でエラーになってしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問