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ポリシーに同意したことになります。

同意します