BLOGスタッフブログ

インソースマーケティングデザイン

2017.04.07 システム

[CakePHP] findメソッドでEXISTS句を使いたいときは?

こんにちは。エンジニアの高田です。
4月です。通勤中も新社会人らしき初々しい姿を見かけます。
私も気持ちを新たにがんばりたいと思います。

さて今回は、CakePHPのデータを取得する際に使用する「findメソッド」のおいてEXISTS句を使いたいけど、どう指定したらよいのだろう??と
CakePHP暦の長い私でも迷ってしまったことがありましたので、その方法をご紹介します。

EXISTS句今まで使ったことなかったのかな??

logo-1

findメソッドとは

今回はCakePHP2を使用していますので、そのバージョンを前提にしています。
CakePHPのモデルを使用し、データを取得するためのメソッドが「findメソッド(Model::find())」です。

<参考>CakePHP 2.x Cookbook-データを取得する

基本的にCookbookからの引用です。

find
find(string $type = ‘first’, array $params = array())

↓$paramsはこんな感じ
array(
  'conditions' => array('Model.field' => $thisValue), //検索条件の配列
  'recursive' => 1, //int
  'fields' => array('Model.field1', 'DISTINCT Model.field2'), //フィールド名の配列
  'order' => array('Model.created', 'Model.field3 DESC'), //並び順を文字列または配列で指定
  'group' => array('Model.field'), //GROUP BYのフィールド
  'limit' => n, //int
  'page' => n, //int
  'offset' => n, //int
  'callbacks' => true //falseの他に'before'、'after'を指定できます
)

↓検索条件はこんな感じで指定します。
public function index() {
  // ステータスがpendingのデータを取得
  $conditions1 = array();
  $conditions1['Article.status'] = 'pending';
  $lists1 = $this->Article->find('all', array(
    'conditions' => $conditions1
  ));

  // ステータスがpending以外のデータを取得
  $conditions2 = array();
  $conditions2['Article.status !='] = 'pending';
  $lists2 = $this->Article->find('all', array(
    'conditions' => $conditions2
  ));
}

EXISTS句を指定してみよう

ちょっとねテーブルの定義がふわっとしているのでアレですけど。。。なんとなく雰囲気で!
Rankingテーブルに存在するArticleデータのみEXISTS句を使って取得してみましょうか。

public function index() {
  // Rankingテーブルに存在するArticleデータのみ取得
  $conditions = array();
  $conditions[] = 'EXISTS(SELECT * FROM ranking AS Ranking WHERE Article.id = Ranking.article_id)';

  $lists = $this->Article->find('all', array(
    'conditions' => $conditions
  ));
}

こんな風にがっつりconditionsに書いてしまえばできました!
ではまた。

インソースマーケティングデザインが書いた他の記事

見積もり・ご依頼など、
お気軽にご相談ください

本サイトはユーザーエクスペリエンスの向上などを目的に、Cookieを使用しています。
右記のバナーで「同意する」をクリックする、または本サイトを利用することにより、
お客様は弊社のCookieポリシーに同意したことになります。

同意します