2011-01-21 14 views
1

モデルクエリ関数をコントローラに呼び出す方法を解決できません。私はカウントするためにあまりにも多くのドキュメントを見てきました。たぶん私は私が全力でやろうとしていることに間違っていますか? MySQLエラーを引き続き取得する(以下のエラー)。コントローラのモデルクエリ関数::コントローラでページングを呼び出すにはどうすればよいですか?

プラン::モデル:

function getActive() 
{ 
$findParameters = array(
    'limit' => 10, 
    'order' => array('Plan.monthly_cost' => 'asc'), 
    'conditions' => array('PlanDetail.active' => 1) 
); 
return $this->find('all', $findParameters); 
} 

プラン::コントローラー:

function search() { 
    $this->Plan->recursive = 2; //*** Modified by Jason: Recursion needs to be corrected with better method. ***// 
    $active = $this->Plan->getActive(); 
    $this->set('plans', $this->paginate($active)); 
} 

お知らせ(8):配列文字列変換[ROOT .... 警告します( 512):SQLエラー:1054: 'where句'の 'Plan'が不明な列

+0

これで、正しい結果が得られるようになりました。$ active = $ this-> Plan-> getActive(); \t \t $ this-> set( 'plans'、$ active);しかし今は私のページネーション(CSSなど)を失ってしまった。 – OldWest

+0

サイドノートとして、これはコントローラ内ですべて行うことができる(ドキュメンテーションごと)、しかし私はモデルの仕事(私のMVCを理解している)が少なくともコントローラにANYクエリを入れる良い理由は見当たりません。 – OldWest

+0

私はあなたに同意します。私はあなたの検索ロジックをモデルに入れるべきだと言うチュートリアルのチュートリアルを見たことがありますが、ページネーションヘルパーはあなたにはそれを強制しません。私はまだ本当に良い答えを見てきました。 –

答えて

1

基本的に$ this-> paginateはクエリの結果を最初のパラメータとして受け入れません。あなたはそんなにモデルであなたのDBのロジックを持っているしたい場合は、このようにそれを実行します。

モデルを

あなたのコントローラで
function getActiveConditions() { 
    retrun array(
     'limit' => 10, 
     'order' => array('Plan.monthly_cost' => 'asc'), 
     'conditions' => array('PlanDetail.active' => 1) 
    ); 
} 

function search() { 
    $this->Plan->recursive = 2; 
    $activeConditions = $this->Plan->getActiveConditions(); 
    $this->set('plans', $this->paginate($this->Plan, $activeConditions)); 
} 

説明:ページ付けの方法最初の引数として渡されたモデルをページングします(またはnullの場合はコントローラのデフォルトモデルを取得します)。2番目のパラメータを使用して結果にいくつかの制限を適用します。

このrecursive = 2のContainable Behaviorをチェックするか、これらの関係を必要以上にバインド解除しないでください。

+0

Nik、これについての説明をありがとう。とても役に立ちました。私のアプローチがこれについて正しいと思いますか、それともコントローラにクエリがある方が良いと思いますか? – OldWest

関連する問題