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

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回答

4006閲覧

CakePHPで検索する時のnullの取り扱い方法について

ssk

総合スコア332

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2017/01/25 05:24

HTML

1<input type="checkbox" name="name[]" value="hoge01"> 2<input type="checkbox" name="name[]" value="hoge02"> 3<input type="checkbox" name="name[]" value="hoge03">

PHP

1//HogesController.php 2if($this->request->is('post')){ 3 $value = $this->request->data('name');//チェックボックス(配列) 4 $hoges = $this->Hoges->find() 5 ->where(["column1 IN" => $value]); 6 }

$this->request->data('name')nullだった時
->where(["column1 IN" => $value]);を生成しないようにしたいです。

######理由
->where(["column IN" => $value]);
の$valueがnullだと検索が機能しないからです。

######補足
他にも複数チェックボックスの項目があります。
->where(["column IN" => $value]);を動的に生成する方法が良いとは思うのですが、
皆さんはチェックボックスのデータベース検索はどうされていますか?

PHP

1//HogesController.php 2if($this->request->is('post')){ 3 $value = $this->request->data('name');//チェックボックス(配列) 4 $hoges = $this->Hoges->find() 5 ->where(["column1 IN" => $value]); 6 ->where(["column2 IN" => $value2]); 7 ->where(["column3 IN" => $value3]); 8 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のようにif文でnameが空ではない場合だけ、whereを追記すればいいと思います。

php

1$hoges = $this->Hoges->find(); 2if(!empty($this->request->data('name'))) { 3 $hoges->where(["column1 IN" => $this->request->data('name')]); 4}

※find()はall()やtoArray()などを呼び出すまで実行されませんので、あとから条件を追記できます。

投稿2017/01/25 05:44

編集2017/01/25 06:06
popobot

総合スコア6586

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

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

ssk

2017/01/25 07:21

ありがとうございます。 !emptyでそれぞれ書いていくのが 初学者の私にとってもわかりやすいので、助かります。 ただ、項目が多い(40項目ほど) ので、できたら行数を少なくしたいです。 icchii様は項目数に限らず、上記の書き方で実行していますか? 実務経験がないので教えていただけると幸いです。 よろしくお願いいたします。
popobot

2017/01/25 07:40

foreach等でループさせたらどうでしょうか。ただ、カラム名とPOSTデータの定義が揃っていないとちょっと扱いにくそうですけどね。
ssk

2017/01/25 07:55

承知しました。 icchii様の方法で実装したいと思います。 ありがとうございました。
KiyoshiMotoki

2017/01/25 08:28

横から失礼します。 追加したい検索条件が全て   ->where(["column IN" => $value]); という形式で共通の場合、 以下のように POSTデータのキーとカラム名の対応を連想配列で定義してやれば、 多少は見通しのよいコードにできるかと思います。 $key2Colname = array(  'name' => 'column1',  'name2' => 'column2',  'name3' => 'column3',  ... ); $hoges = $this->Hoges->find(); foreach ($key2Colname as $key => $colname) {  $value = $this->request->data($key);  if (!is_null($value)) {   $hoges->where(["$colname IN" => $value]);  } } ただし、手元に環境がないため、上のコードは動作確認しておりません(^^;
ssk

2017/01/25 08:31

KiyoshiMotoki様 サンプルコードまで、ありがとうございます。 参考になります!
ssk

2017/01/26 08:33

何度も申し訳ございません、、 最終的にチェクボックスから以下のSQL文を発行したい場合 SELECT * FROM articles WHERE ( AND( author_id = 2 OR author_id = 5 ) AND( published = 1 OR published = 2 ) AND( view_count >= 10 OR view_count >= 10; ) 皆さんはコントローラー側の処理をどのように書いていますか?
popobot

2017/01/26 12:22 編集

条件がチェックボックスによって違うなら、個々に処理を書くと思います。 author_idやpublishedはORではなくINに書き換えた方が簡単ですかね... view_countは同じ条件が2つあってよくわかりません。
ssk

2017/01/26 13:25

ありがとうございます! 早速、実装してみます。
guest

0

クエリビルダの機能を使えばできそうな気がしますが、

php

1$hoges = $this->Hoges->find() 2 ->where(function($exp) { 3 return $exp->in('column1', $param); 4 }) 5 ->andWhere(... 6 ->orWhere(...

投稿2017/01/25 06:04

turbgraphics200

総合スコア4267

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

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

ssk

2017/01/25 07:17

$param がチェックボックスで配列のため Undefined variable となってしまいます。 配列の場合、どのように処理すればよいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問