CakePHPクッキング

データを取得する

開発環境:CakePHP2.5.1

データを取得したい時に少し変わった条件で取得したい場合があります。
それぞれのやり方を見ていきましょう。

同カラムに対してOR条件を指定する
LIKE文であいまい検索
◯以上や◯以下など<を使って検索
◯以上◯以下の上下限値で取得
カラムを別名(AS句)を付ける
1カラムのみ取得
findをスッキリさせるfindBy/findAllBy
重複データを排除
日付カラムを一部の条件で取得
findをカスタマイズ

同カラムに対してOR条件を指定する

同じカラムをOR条件で取得したい場合は、下記のように配列を使って指定します。

<?php
$params = array(
    'conditions' => array(
        array(
            'or' => array(
                array('status' => '1'),
                array('age' => '20'),
            ),
        ),
        array(
            'or' => array(
                array('status' => '2'),
                array('age' => '40'),
            ),
        ),
    ),
);

LIKE文であいまい検索

LIKE文を使うには次のようにします。

<?php
$params = array(
    'conditions' => array(
        'name like' => '山田%',
    ),
);

◯以上や◯以下など<を使って検索

2,000円以上のデータのみ取得する場合などは次のようにします。

<?php
$params = array(
    'conditions' => array(
        'price >' => 2000,
    ),
);

◯以上◯以下の上下限値で取得

特定の値の範囲でデータを取得したい時はbetweenを使用します。

<?php
$params = array(
    'conditions' => array(
        'id between ? and ?' => array(10, 30),
    ),
);

カラムを別名(AS句)を付ける

カラムを結合する場合などで別名を付けたい時の方法で、下記のようにすると、

<?php
$params = array(
    'fields' => array(
        'CONCAT(User.first_name, " ", User.last_name) AS "User__name"',
    ),
);
$data = $this->User->find('all', $params);
?>

結果は、

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [User__name] => 山田 太郎
                )

        )

)

思ったような戻り値が得られません。

こんな時にはModelでVirtual fieldsを使います。

<?php
public $virtualFields = array(
    'name' => 'CONCAT(User.first_name, " ", User.last_name)'
);
?>

結果は、

Array
(
    [0] => Array
        (
            [User] => Array
                (
                    [id] => 1
                    [first_name] => 山田
                    [last_name] => 太郎
                    [name] => 山田 太郎
                )
        )
)

countやsumを使う時のフィールド名を指定する場合もVirtual fieldsを利用します。

1カラムのみ取得

1つの項目のみ欲しい場合、fieldsパラメータでデータが欲しいカラムを指定することで取得することができますが、もっと簡単に取得するにはfieldメソッドを利用します。

<?php
$this->User->id = 20;
$name = $this->User->field('name');

findをスッキリさせるfindBy/findAllBy

複雑な条件ではない場合、$params変数にあれこれ書くとコードが膨れ上がってしまいます。
それを解消するために、1つのデータを取得する場合はfindBy、複数のデータを取得する場合はfindAllByを利用します。

<?php
$data = $this->Sample->findByFlg(1);

これでsamplesテーブルのflgカラムが1のデータ一つが返されます。
複数のカラムの条件を付けたい場合はAndでつなぎます。

<?php
$data = $this->Sample->findByFlgAndPrice(1, 1000);

これでsamplesテーブルのflgカラムが1かつpriceが1000のデータ一つが返されます。

条件以外にもfieldsやorderも下記の順番で渡すことで反映されます。
findBy(string $value[, mixed $fields[, mixed $order]]);

複数のデータを取得する場合のfindAllByも使い方は全く同じで、オプションとして下記の内容が増えます。
findAllBy(string $value, array $fields, array $order, int $limit, int $page, int $recursive)

重複データを排除

重複したデータを排除するSQLを書くには、DISTINCTを付けますが、CakePHPでは次のようにfieldsの先頭にそのまま付けるだけでになります。

<?php
$params = array(
    'fields' => array(
        'DISTINCT user_id',
    ),
);
$data = $this->Sample->find('all', $params);

通常のfindであれば上記の方法でいいのですが、ページネーションを利用する場合には注意が必要です。
詳しくは「ページネーションではDISTINCTではなく、GROUP BYを使う」をご覧ください。

日付カラムを一部の条件で取得

日付データを持ったカラムで、今年のデータだけを抽出したい場合などは、次のように行います。

<?php
$params = array(
    'conditions' => array(
        'posted like' => '2014%', 
    ),
);
$data = $this->Sample->find('all', $params);

このようにlike文を使ってもデータは取得できますが、日付の場合はもっと便利な関数が用意されていますので、そちらを利用しまよう。
例えばMySQLの場合は、次のようになります。

<?php
$params = array(
    'conditions' => array(
        'date_format(posted, "%Y")' => '2014', 
    ),
);
$data = $this->Sample->find('all', $params);

“%Y”の部分は変更することで、月だけで指定したりすることもできます。

findをカスタマイズ

findを独自にカスタマイズさせたい時や、コントローラーをもっと整理させたい場合に使えるのが、findMethodsです。
詳しい使い方は「独自のfindを定義するfindMethods」をご覧ください。

WordPressとCakePHPの共存

サイトを作るのに便利なWordPress。プラグインも数多く用意されて

サイトマップの作成方法

Googleのウェブマスターツールに渡すためのサイトマップの作成方法で

INSERTしたIDを取得する

データを保存した後にINSERTされたデータのIDを使って何かの処理を

ファイルの存在確認やフォルダー内のファイル一覧取得

特定のファイルの存在を確認したい場合や特定のフォルダー内にあるファイル

リンクの最後に常にスラッシュをつける方法

URLの最後に常にスラッシュをつけるかつけないかを統一する方法は、UR

countやsumを使う時のフィールド名を指定する

CakePHPでcountやsumなどを使う場合、ちょっとした工夫が必

Formの便利な使い方

問い合わせフォームや会員機能など、WEBサイトを作る際に必ず必要になる

ヘルパーをオーバーライドする

CakePHPで便利な機能が詰まったヘルパーですが、時々もう少しこうだ

特定の時だけSQLの条件を追加するならSet::mergeを使う

SQLの条件を追加したい時に使うのがarray_mergeなどですが、

ページネーションではDISTINCTではなく、GROUP BYを使う

重複したデータを省く時に使うDISTINCTですが、ページ送りで使う時

Model内で別のModelを呼び出す

モデル内で別のモデルを使いたいケースがあった場合、次のようにすることで

CakePHPでGoogleAnalyticsAPIを使う

CakePHPでGoogleAnalyticsを使う方法について見てい

独自のfindを定義するfindMethods

findをより便利に、よりスッキリ書くのに、findMethodsを使

TCPDFを使ってCakePHPでPDFを作成

CakePHPでPDFを作成するには幾つかの方法がありますが、今回はT

JavaScriptをコードの最下部に配置

SEOの観点からJavaScriptのコードは一番下に記述したいところ

無限スクロールをさせる

TwitterやFacebookのタイムラインを見ていて、ページの下に

PHPExcelの導入

ExcelにDBのデータを表示して一覧を作ったり、請求書などのフォーマ

Warning: SplFileInfo::openFile〜の警告が表示されたら

ShellとWEBの両方で同一のModelを呼び出す時に「Warnin

連結されていないデータを抽出

通常、テーブルを連結してデータを取得するには、アソシエーションを利用し

データを取得する

データを取得したい時に少し変わった条件で取得したい場合があります。

PAGE TOP ↑