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

データベース検索の基本 (3/5)

作成:2015-09-26 10:22
更新:2015-09-26 10:34

■selectとorder

検索して必要なエンティティを受け取るという作業は、whereだけで行えます。が、多数のエンティティを受け取る際に、「どういう形で受け取るか」を考えることもあるでしょう。検索を補足する機能として、ここでは2つのメソッドを挙げておきましょう。

●取り出すフィールドを指定する「select」
selectメソッドは、取り出すフィールドを指定します。すべてのフィールドを取り出すのでなく、テーブルにあるフィールドから必要な項目だけを指定して取り出すのに用います。これは、以下のように記述します。
《Query》->select([ field1, field2, …])

引数には、取り出したいフィールド名をまとめた配列を用意しておきます。

●並び順を指定する「order」
findで検索するとき、何も指定してないとレコードを登録した順番に取り出されます(一般的にはidの順番通り)。が、特定の順番で並べ替えたい場合は、この「order」を利用します。
《Query》->order( [ field名 => 'Asc' または 'Desc' ] )

引数には、並べ替えの基準となるフィールド名に「Asc」または「Desc」のいずれかの値を設定した連想配列を用意します。「Asc」は昇順(小さいものから順に並べる)、「Desc」は降順(その逆の順)を意味します。

では、これらの利用例を挙げておきましょう。下は、先ほどのfindメソッドにselectorderを追加したものです。検索テキストを入力して送信すると、そのテキストをnameに含むレコードをname順に並べます。また表示されるのはIDとnameのみで、その他の項目は値が表示されません。

ここで検索処理を行っている文を見ると、このように書かれていることがわかるでしょう。
$this->Persons->find()->select(○○)->order(○○)->where(○○);

メソッドがすべてつながった形で書かれていますね。これらのメソッドはすべてQueryクラスに用意されており、しかもすべてQueryインスタンスを返すようになっています。つまり、メソッドを呼び出すと、その処理を設定した自分自身が返されるのです。このため、こうやって次々とメソッドを連続して呼び出すような書き方が可能になっているのです。

こうした書き方を「メソッドチェーン」と呼びます。メソッドチェーンを使うと、メソッドの返値をいちいち変数に代入したりする必要がなく、非常に簡単に複雑な処理を記述できます。データベース関連の機能(Queryに用意されるメソッド類)は、このメソッドチェーンを利用した書き方が可能です。今のうちに、この書き方に慣れておくと良いでしょう。

では、利用例を下にあげておきましょう。例によってフィールドに検索テキストを書いて送信すると、エンティティからIDとnameの値だけを取り出し、name順に並べ替えて表示します。

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

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

●プログラム・リスト●

public function find() {
    $this->set('msg', null);
    if ($this->request->is('post')) {
        $find = $this->request->data['find'];
        $persons = $this->Persons->find()
            ->select(['id', 'name'])
            ->order(['name' =>'Asc'])
            ->where(["name like " => '%' . $find . '%']);
    } else {
        $persons = [];
    }
    $this->set('persons', $persons);
}

※関連コンテンツ

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