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

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

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

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

CakePHP

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

Q&A

解決済

1回答

1041閲覧

cakephp2 検索条件の設定方法について

Tannnnnnnnnnn

総合スコア24

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2020/04/30 10:12

編集2020/04/30 10:16

cakePHP2の検索方法についてご教示願います。

会員情報管理システムにおいて、会員の回答有無を検索する検索機能(検索フォーム)を付けようとしておりますが、
コントローラー内での検索条件設定が合ってないようです、、

①会員の回答有りの場合→Viewから「1」をcontrollerへ送って検索
②会員の回答無しの場合→Viewから「2」をcontrollerへ送って検索

したいです。

①の空欄じゃ無い場合の、検索条件部分のみ上手く動かず、困っております。

Viewファイルで以下のように、該当検索フォームの条件を記載しました。

$this->Form->input( 'person_answer_exists', array( 'type' => 'select', 'multiple' => 'checkbox', 'options' => array(1 =>'あり' , 2 => 'なし'), 'label' => false, ) )

対応するコントローラーでの検索条件の記載をしました。
・対象DBテーブル Persom
・対象DBカラム pe_contents
・①の場合のViewから送られてくる値 
$this->$request->data('Person.person_answer_exists = array{[0] => 1)

if($this->$request->data('Person.person_answer_exists' === 1)){ $condition[ 'Person.pe_contents' ] != ''; }

不足情報等ございましたら、お知らせください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

色々と構文が間違っています。

$this->$request だと、$request変数に格納されている名前の$thisのプロパティという意味になります。何もしていなければ $request = nullなので、$this->(null) ということでエラーが発生するはずです。

$this->request が正しいです。


$this->request->data()(CakeRequest::dataメソッド)は、$_POST['data']の配列からドット区切りで値を取得します。

POST データにアクセス | リクエストとレスポンスオブジェクト - 2.x

$this->request->data('Person.person_answer_exists' === 1) と書くと、'Person.person_answer_exists' === 1の方が先に評価されますので、$this->request->data(false) と同義です。

これは、(int)$this->request->data('Person.person_answer_exists') === 1 と書きましょう。
(int)を頭に付けているのは整数型に型変換するためです。
POSTデータは通常文字列として得られます。1ではなく'1'が返ってきます。
===は型を含めた比較ですので、型変換をしないと'1' === 1の比較となり false になります。

厳密に判定するなら上記の書き方ですが、値が0,1しかないのであれば、 if ($this->request->data('Person.person_answer_exists')) でも大丈夫です。


$condition[ 'Person.pe_contents' ] != '' は、$condition配列の'Person.pe_contents'キーと、空文字列を比較しているだけで代入をしていません。

Person.pe_contentsが空文字のレコードに制限したいのであれば、

$condition['Person.pe_contents !='] = '' とします。

ただし、pe_contentsにNULL制約があり、nullは格納されていないことが保証されていないと意図した結果にならないと思います。

その場合、Person.pe_contents IS NOT NULL も条件に加えると良いでしょう。

また、モデルのfind関数の条件パラメーター名はconditionsですので変数名も合わせておくと色々と楽です。


以上をふまえると、以下になります。

php

1if((int)$this->request->data('Person.person_answer_exists') === 1){ 2 $conditions['Person.pe_contents !='] = ''; 3 $conditions[] = 'Person.pe_contents IS NOT NULL'; // これはDBスキーマ次第で必要 4}

追記

person_answer_existsが複数値(multiple)ということなので、$this->request->data('Person.person_answer_exists') の返り値は、['1'], ['2'], ['1', '2'], null のいずれかになりますよね。

POSTされる値が配列なので in_array を使ってフラグが指定されてるか確認します。

PHP: in_array - Manual

また、条件が複数指定された場合にいずれかに該当するレコードを取得したいのであれば条件を OR で繋ぎます。

複雑な検索条件 - データを取得する - 2.x

php

1$personAnswerExists = $this->request->data('Person.person_answer_exists'); 2 3if ($personAnswerExists !== null) { // person_answer_existsが指定されていなければ null が返るので除外しておきます。 4 $personAnswerExists = array_map('intval', (array)$personAnswerExists); // 配列化して、個々の値を整数変換しています 5 6 $conditions['OR'] = []; 7 8 if (in_array(1, $personAnswerExists, true)) { 9 $conditions['OR'][] = ['Person.pe_contents !=' => '']; 10 } 11 12 if (in_array(2, $personAnswerExists, true)) { 13 $conditions['OR'][] = ['Person.pe_contents' => '']; 14 } 15}

投稿2020/05/01 00:15

編集2020/05/01 06:30
nojimage

総合スコア957

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

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

Tannnnnnnnnnn

2020/05/01 01:15

ご回答ありがとうございます。 お陰様でViewから1が送られる時に検索できるようになりました。 しかし、Viewから2が送られる場合も、1が送られて来た時と同様の検索結果となってしまいます。 以下、コントローラの記載部分ですが、何か間違いがございますでしょうか。 お手数おかけしますが、ご確認お願いします。 if((int)$this->request->data('Person.person_answer_exists') === 1){ $conditions['Person.pe_contents !='] = ''; } if((int)$this->request->data('Person.person_answer_exists') === 2){ $conditions['Person.pe_contents '] = ''; }
nojimage

2020/05/01 02:53

$conditions['Person.pe_contents '] に余分なスペースが含まれていませんか?また、pe_contentsはNOT NULLなフィールドということでよいでしょうか。
Tannnnnnnnnnn

2020/05/01 03:06

余分なスペースは含まれておりませんね、、、。 NOT NULLなフィールドです。
nojimage

2020/05/01 03:08

$conditions['Person.pe_contents '] $conditions['Person.pe_contents']
Tannnnnnnnnnn

2020/05/01 03:11

語弊がありました。そのスペースは削除し、実行しております。
Tannnnnnnnnnn

2020/05/01 03:14

if((int)$this->request->data('Person.person_answer_exists') === 1){ $conditions['Person.pe_contents !='] = ''; } if((int)$this->request->data('Person.person_answer_exists') === 2){ $conditions['Person.pe_contents'] = ''; } スペースを削除し、上記で実行しておりますが「1」が送られてきたパターンしか実行されず、、
nojimage

2020/05/01 03:33

(int)$this->request->data('Person.person_answer_exists')が2でif文の中に入っていることは確認されていますか?
nojimage

2020/05/01 03:35

あ、フォームから person_answer_exists = 2 で送っているつもりなのに、Controller側ではperson_answer_exists = 1 になっているってことでしょうか
Tannnnnnnnnnn

2020/05/01 03:53

ご返信ありがとうございます。 >(int)$this->request->data('Person.person_answer_exists')が2でif文の中に入っていることは確認されていますか? 今確認し、入っておりませんでした、、。 if((int)$this->request->data('Person.person_answer_exists') === 1){ $conditions['Person.pe_contents !='] = ''; } の中では、 $this->request->data() を入れて更新すると、値を確認出来ます。 >あ、フォームから person_answer_exists = 2 で送っているつもりなのに、Controller側ではperson_answer_exists = 1 になっているってことでしょうか いえ、controller側で確認しており、 array{ [0] => 1 //あり [1] => 2 //なし } で送られてきております、、
nojimage

2020/05/01 04:49

フォームの方の 'multiple' => 'checkbox', を見逃していましたね。multipleは不要です。
Tannnnnnnnnnn

2020/05/01 05:57

チェックボックスで表示させたいため、multipleの記載は必要そうでした、、
nojimage

2020/05/01 06:03 編集

会員の回答は、あり、なし両方にチェックを入れれるということですね。 あり、なし両方にチェックが入った場合は、両方の検索条件がORで結合されるような形にするとよいでしょうか
Tannnnnnnnnnn

2020/05/01 06:24

その通りです。すみません、言葉足らずで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問