libro
www.tuyano.com
初心者のためのCakePHP 1.3 プログラミング入門

モデルを更に考える (2/7)

作成:2010-02-18 17:11
更新:2010-05-10 20:02

■より複雑な検索をするには?

この「findAllBy~」による検索は、とても便利ですが、万能ではありません。例えば、フォームの"FIND"フィールドに入力された値を使い、「特定の名前の人だけ検索する」というような仕組みを作るとしましょう。このとき、
$datas = $this->Mydata->findAllByName($this->data["Mydata"]["FIND"]);
このようにしてデータを検索すればいい、と思うでしょう。実際にやってみると、「山田太郎」と入力して双信すれば、ちゃんと山田太郎さんのデータが表示します。が、「山田」と入力すると、何も検索されません。このやり方だと、完全に一致する値だけしか検索することができないのです。

では、どうすればいいのか? こういう場合、「find」メソッドを利用する方法があります。前回使ったfind("all")ですね。これを、こんな感じで呼び出します。
モデル->find("all", 連想配列 );
第2引数に、検索に関する細かな情報を連想配列として用意します。これにより、柔軟な検索が行えるようになるのです。例えば、先ほどのサンプルで、「findAllById~」の文を、下のリストのように書き換えてみましょう(長いので適時改行してます)。これで検索を行うと、入力した文字を含むデータが全て検索されます。例えば「田」と検索すると、名前に「田」の字を含むものがすべて表示されるのです。――ここでは、第2引数の連想配列の中に、以下のようなものが用意されています。
"conditions"=> array( 項目の指定 => 検索する値の指定 );
このconditionsというのは、検索の条件を設定するためのものです。これは、その後に配列として条件を設定します。ここでは、以下のような形で条件が設定されていました。
array("Mydata.name like ?"=>array("%{$this->data["Mydata"]["FIND"]}%"))
これは、"Mydata.name like "%検索文字%"というように検索の条件を設定するものです。これにより、nameの値に検索文字が含まれていれば検索されるようになります。

ここでは、データベースアクセスを行うための「SQL」という言語の機能を使って指定を行っています。SQLでは、「name like '%××%'」というようにして全文検索が行えるようになっているのですね。

このあたりになると、データベースに問い合わせるための言語「SQL」について勉強しないと、なかなか思うようにデータの検索は行えなくなってくるでしょう。まずは、SQLの基本について学ぶのがよいでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※nameの検索を行うための文

$datas = $this->Mydata->find("all",
		array("conditions"=>array(
				"Mydata.name like ?"=>array(
						"%{$this->data["Mydata"]["FIND"]}%"))));

※関連コンテンツ

「初心者のためのCakePHP 1.3 プログラミング入門」に戻る