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

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

解決済

4回答

5415閲覧

cakephp3 検索条件をselect式にしてand検索したい。(select式が未選択の場合はallとする)

holic

総合スコア134

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2017/06/01 16:25

編集2017/06/01 16:29

###前提・実現したいこと
【したいこと】cakephp3 検索条件をselect式にしてand検索したい。

テーブルの全件を下記とします。
URLはhttp://localhost/caketest/photos/とします。

イメージ説明

テーブルに対しての検索画面を下記となります。
URLはhttp://localhost/caketest/photos/find/ とします。

イメージ説明

現在の機能はName,area,styleテキスト検索にて、条件に一致したものが表示される仕組みです。

【実現したいこと】
・テキスト記述式ではなくてセレクト式にしたい。(Area,Styleそれぞれの)
・2つとも値がセットされていたらAND検索にする。
・Area選択にしてもStyle選択にしても選択されていなかったら【all選択】とする。
・IDに対しての昇順、降順選択ラジオボタンをつける(初期選択は昇順)。

実現したいイメージ
イメージ説明

現在のソースを記述します。
PhotosController.php
※findの記述のみです。

php

1 public function find() { 2 $photos = []; 3 if ($this->request->is('post')) { 4 $find = $this->request->data['find']; 5 $photos = $this->Photos->find() 6 ->where(["name like " => '%' . $find . '%']) 7 ->orwhere(["area like " => '%' . $find . '%']) 8 ->orwhere(["style like " => '%' . $find . '%']); 9 } $this->set('msg', "名前orエリアorスタイルで検索出来ます(あいまい検索も可能)"); 10 $this->set('photos', $photos); 11 }

Template/Photos/find.php

php

1<div> 2 <h3>Find photo</h3> 3 <?= $msg ?> 4 <?= $this->Form->create() ?> 5 <fieldset> 6 <?= $this->Form->input('find'); ?> 7 <?= $this->Form->button('Submit') ?> 8 <?= $this->Form->end() ?> 9 </fieldset> 10 <table> 11 <thead> 12 <tr> 13 <th>ID</th> 14 <th>NAME</th> 15 <th>AREA</th> 16 <th>STYLE</th> 17 </tr> 18 </thead> 19 <tbody> 20 <?php foreach ($photos as $photo): ?> 21 <tr> 22 <td><?= h($photo->id) ?></td> 23 <td><?= h($photo->name) ?></td> 24 <td><?= h($photo->area) ?></td> 25 <td><?= h($photo->style) ?></td> 26 </tr> 27 <?php endforeach; ?> 28 </tbody> 29 </table> 30</div>

お手数ではございますが、ご教示いただけましたら幸いでございます。

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

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

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

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

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

guest

回答4

0

このようにすると、orWhereの検索が可能になると思います。

PHP

1 $conditions['OR'] = []; 2 if (!empty($requestData['name'])) { 3 $conditions['OR']['name like'] = '%'.$requestData['name'].'%'; 4 } 5 if (!empty($requestData['area'])) { 6 $conditions['OR']['area like'] = '%'.$requestData['area'].'%'; 7 } 8 if (!empty($requestData['style'])) { 9 $conditions['OR']['style like'] = '%'.$requestData['style'].'%'; 10 }

つまり、条件となる配列のキーを'OR'にした連想配列を生成することで自動的にorWhereの条件
であると認識させることができます。

ご参考ください^^

投稿2017/06/13 11:45

TakuyaHidaka

総合スコア137

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

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

holic

2017/06/13 12:22

TakuyaHidakaさん 回答を頂きましてありがとうございます。まだまだcakephp習いたてで初歩的なところでつまづいているので大変参考になりました、助かります。 今後ともどうぞよろしくお願いいたします。
guest

0

ベストアンサー

Controllerについて、コメントでいただいた質問にお答えします。
遅くなってしまい、申し訳ありません。

PHP

1public function find() { 2 $photos = []; 3 4 // 今回はこちらで大丈夫ですが、検索ボタンを押したときのHTTPリクエストはGETで処理する方がよいです。 5 if ($this->request->is('post')) { 6 7 // $findとしてリクエストからデータを取得しておりましたが、変数名はわかりやすいものがよいでしょう。 8 // 単純にリクエストデータとして、そのまま取得した方が後で見返したときに把握しやすいと思います。 9 $requestData = $this->request->data(); 10 // 検索及び一覧データの作成にはいくつか方法がありますが、こちらでお試しください。 11 // 検索条件を事前に作ってしまいます! 12 $conditions = []; 13 if (!empty($requestData['name'])) { 14 $conditions['name like'] = '%'.$requestData['name'].'%'; 15 } 16 if (!empty($requestData['area'])) { 17 $conditions['area like'] = '%'.$requestData['area'].'%'; 18 } 19 if (!empty($requestData['style'])) { 20 $conditions['style like'] = '%'.$requestData['style'].'%'; 21 } 22 // こうすると、検索条件に合わせて自在にwhere句を生成できます^^ 23 $photos = $this->Photos->find() 24 ->where($conditions); 25 } 26 // この$msgは、config/の直下にconst.phpなどを作って定数として定義し、.ctpファイルの中でしようするとよいでしょう。今回はこのままで大丈夫です! 27 $this->set('msg', "名前orエリアorスタイルで検索出来ます(あいまい検索も可能)"); 28 $this->set('photos', $photos); 29}

簡単に作成してみましたが、もし今後進めていく中でお困りのことやコードのレビューなどがありましたら直接ご質問いただければ、回答したいと思います。

参考になれば幸いです。

投稿2017/06/02 22:38

編集2017/06/03 04:56
TakuyaHidaka

総合スコア137

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

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

holic

2017/06/03 04:30

TakuyaHidaka様 ありがとうございます。 ほぼほぼコンプリートできそうです\(^o^)/。 補足質問を何点かさせてください。 ・if (!empty($requestData['name'])) {~の 記述が3回続きますが、これは、それぞれにname,area,styleに書き直したほうがよいのでしょうか。 ・// 単純にリクエストデータとして、そのまま取得した方が後で見返したときに把握しやすいと思います。 $requestData = $this->request->data(); この$this->request->data()の中は入れないほうが良いのですね、何の変数を入れたらいいのかといつも迷っていたので参考になりました。 ・ $photos = $this->Photos->find() ->where($conditions); } array形式にして上記のようにしたら複数検索できることも初めて知りました、これはcakephpの【queryBuide】rが機能してくれているのでしょうか。 ・
holic

2017/06/03 04:32

TakuyaHidaka様のControllerを基に Template/Photos/find.php を追記しました。 問題なく動いております。
TakuyaHidaka

2017/06/03 04:55

・if (!empty($requestData['name'])) {~の 記述が3回続きますが、これは、それぞれにname,area,styleに書き直したほうがよいのでしょうか。 > 間違えました(><)。修正します! array形式にして上記のようにしたら複数検索できることも初めて知りました、これはcakephpのqueryBuiderが機能してくれているのでしょうか? > おっしゃるとおりです。クエリビルダによる変換です。
holic

2017/06/03 05:42

TakuyaHidakaさん 丁重にありがとうございます、より理解が深まりました。 【もし今後進めていく中でお困りのことやコードのレビューなどがありましたら直接ご質問いただければ、回答したいと思います。 】 まだまだcakephp他の部分でハマりまくってますので、今後もサポートをお願いすると思います。よろしくお願いします。
holic

2017/06/03 07:04

【直接メッセージという機能がテラテイル上でわからなかったのでここに追記します。】 一行一行などにコメントアウトでその意味を書いていただき大変理解出来ました、 追加でもう一つ質問です(こうゆう場合はもう一回質問投稿し直したほうがよいのでしょうか)。 先程のシステムでは、【and】検索でしたが、もし【or】検索にしたい場合はPhotoController.phpはどのように記述すればよろしいでしょうか(orWhereをどのように記述すればよいのか)。 お手数ですがお時間ありましたらお願い致します
TakuyaHidaka

2017/06/13 11:36

お返事が遅くなりまして、申し訳ありません。 ご質問が合った場合は、一度投稿したあとで回答者を選択できる機能があるようです。 一度、ご確認いただけるとありがたいです。 回答ですが、↓に書きたいと思います^^
TakuyaHidaka

2017/06/13 11:38

回答依頼という機能が画面上にあると思いますので、今後はそちらを介していただけるとレスポンスが早くなりますので、よろしくお願いいたします^^
holic

2017/06/13 11:45

ご連絡ありがとうございます。テラテイルの使い方についてちょっと調べてみます。
holic

2017/06/13 11:48

相互フォローの関係でないと「回答依頼」ができないのかと思われます。 TakuyaHidakaさん、もしよかったら私をフォローお願いいたします。
TakuyaHidaka

2017/06/14 01:13

フォローいたしました。 今後ともよろしくお願いします^^
holic

2017/06/14 02:57

確認しました、ありがとうございます☺
guest

0

TakuyaHidakaさんのControllerを基に
Template/Photos/find.ctp
を書き直しました。

php

1<div> 2 <h3>Find photo</h3> 3 <?= $msg ?> 4 <?= $this->Form->create() ?> 5 <fieldset> 6 <?= $this->Form->input('name'); ?> 7 <?php 8 echo $this -> Form -> input ( "area", 9 [ "type" => "select", 10 "options" => [ "リピング" => "リピング", 11 "パスルーム" => "パスルーム", 12 "ベットルーム" => "ベットルーム" ], 13 "value" => "リピング", 14 "empty" => "条件なし検索" ] ); 15 ?> 16 17 <?php 18 echo $this -> Form -> input ( "style", 19 [ "type" => "select", 20 "options" => [ "ワイドスパン" => "ワイドスパン", 21 "アクセントウォール" => "アクセントウォール", 22 "フラット" => "フラット" ], 23 "value" => "フラット", 24 "empty" => "条件なし検索" ] ); 25 ?> 26 27 28 29 <?= $this->Form->button('Submit') ?> 30 <?= $this->Form->end() ?> 31 </fieldset> 32 <table> 33 <thead> 34 <tr> 35 <th>ID</th> 36 <th>NAME</th> 37 <th>AREA</th> 38 <th>STYLE</th> 39 </tr> 40 </thead> 41 <tbody> 42 <?php foreach ($photos as $photo): ?> 43 <tr> 44 <td><?= h($photo->id) ?></td> 45 <td><?= h($photo->name) ?></td> 46 <td><?= h($photo->area) ?></td> 47 <td><?= h($photo->style) ?></td> 48 </tr> 49 <?php endforeach; ?> 50 </tbody> 51 </table> 52</div>

投稿2017/06/03 04:20

編集2017/07/12 10:29
holic

総合スコア134

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

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

0

詳細な回答は後ほどいたしますが、すこしだけお教えしますと、
CakePHP3には、Formヘルパーというセレクトボックスやチェックボックスなどといった
入力用のフォームを生成を手助けしてくれるクラスが準備されています。

またラジオボタンでIDの昇順、降順を切り替えるというお話でしたが、
一覧にはPaginatorという機能があり、テーブルのヘッダーをクリックすることで
昇順、降順を切り替えできる仕組みが用意されています。

ますは、CakePHP3の公式サイトを見るか先ほどのキーワードでもう一度検索されると
よいかと思います。

CakePHP3公式サイト

投稿2017/06/01 22:29

TakuyaHidaka

総合スコア137

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

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

holic

2017/06/02 07:45

Cakephp習いたてなので初歩的なことも知らずで申し訳ございません、Formヘルパーまだinput="text"しか試しておりませんでした、勉強になります。 一番肝となる部分が「area」と「sytle」の条件のときのand検索をどのようにするかというところです。 そしてareaが選択されていなかったらareaは"all"とする挙動などが一番知りたいところです。 PhotosController.php の記述に困っております、お手数ではございますが回答をお願いできますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問