インソースマーケティングデザイン
2017.04.07 システム
[CakePHP] findメソッドでEXISTS句を使いたいときは?
こんにちは。エンジニアの高田です。
4月です。通勤中も新社会人らしき初々しい姿を見かけます。
私も気持ちを新たにがんばりたいと思います。
さて今回は、CakePHPのデータを取得する際に使用する「findメソッド」のおいてEXISTS句を使いたいけど、どう指定したらよいのだろう??と
CakePHP暦の長い私でも迷ってしまったことがありましたので、その方法をご紹介します。
EXISTS句今まで使ったことなかったのかな??
findメソッドとは
今回はCakePHP2を使用していますので、そのバージョンを前提にしています。
CakePHPのモデルを使用し、データを取得するためのメソッドが「findメソッド(Model::find())」です。
<参考>CakePHP 2.x Cookbook-データを取得する
基本的にCookbookからの引用です。
↓$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に書いてしまえばできました!
ではまた。