独自のfindを定義するfindMethods
開発環境:CakePHP2.5.1
findをより便利に、よりスッキリ書くのに、findMethodsを使う方法があります。
findMethodsの基本的な使い方を見ていきましょう。
コントローラーの設定
まずはコントローラーの設定ですが、こちらは通常とほとんど変わりありません。
<?php
App::uses('AppController', 'Controller');
class SampleController extends AppController
{
public $uses = array('Sample');
public function index() {
$data = $this->Sample->find('samplelist');
$this->set(compact('data'));
}
}
一つ違う点は、find内のパラメータがallやfirstではなく、独自のsamplelistを指定しています。
モデルの設定
次にモデルの設定です。
<?php
App::uses('AppModel', 'Model');
class Sample extends AppModel
{
public $findMethods = array('samplelist' => true);
protected function _findSamplelist($state, $query, $results = array()) {
if ($state == 'before') {
$query['conditions']['flg'] = 1;
return $query;
}
return $results;
}
}
findMethodsでコントローラーで指定したsamplelistをtrueで設定します。
そして、そのsamplelistをキャメルケースにしたものに、_findを付けた関数を上記のように準備します。
この関数は、2度呼び出され、1度目はstateにbeforeが指定され、queryに各種条件が入ってきます。
上記のように分岐させて、queryに条件を追加して書くことで、コントローラーにゴチャゴチャ書かずにModelで一括して書くことができます。
そして、2回目にこの関数が呼び出される時に、結果がresultsに帰ってくるので、上記ではそのままreturnさせていますが、戻り値に対して何らかの処理を加える事もできます。
findMethodsを使ってページネーションを使う
findMethodsを使ってページ送りを実装したい場合は、コントローラーの部分を通常のpaginateメソッドを使って呼び出してあげるだけで実現できます。
<?php
App::uses('AppController', 'Controller');
class SampleController extends AppController
{
public $uses = array('Sample');
public function index() {
$this->paginate = array('samplelist');
$data = $this->paginate('Sample');
$this->set(compact('data'));
}
}
