2016-03-21 1 views
0

と呼ばれていません、私はカスタムクエリを構築し、このように、デフォルトのページネータを使用してみました:CakePHPのカスタムクエリページネータに:カスタムのpaginate関数が

WodsController.php

$userId = $this->Auth->user('id'); 
$connection = ConnectionManager::get('default'); 
$result = $connection->execute("SELECT wods.id, wods.titulo , wods.dia , wods.tempo, wods.repeticoes ,userwods.user_id FROM wods 
LEFT JOIN userwods ON userwods.wod_id = wods.id WHERE userwods.user_id is null or userwods.user_id=4 order by wods.dia desc limit 50")->fetchAll('assoc'); 
$results = array(); 
foreach ($result as $r) { 
    $entity = $this->Wods->newEntity($r); 
    array_push($results, $entity); 
} 
$wods = $this->paginate($results); 
$this->set('_serialize', ['wods']); 

私はできません「このエラーを得ました「ページネートと互換性のあるオブジェクトを見つける」。

今私はカスタムクエリpaginatorを実装しようとしていますが、動作しません。 モデルにpaginate関数とpaginateCount関数を実装しました。 Wods.phpファイル:WodsController.php

public function index() 
{ 
    $this->Wods->recursive = 0; 

    $this->paginate = array('Wods'=>array('limit'=>10)); 

    $this->set('wods', $this->paginate('Wods')); 
} 

コントローラで

public function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) { 
    $recursive = -1; 

    $this->useTable = false; 
    $sql = ''; 

    $sql .= "SELECT wods.id, wods.titulo , wods.dia , wods.tempo, wods.repeticoes ,userwods.user_id FROM wods LEFT JOIN userwods ON userwods.wod_id = wods.id WHERE userwods.user_id is null or userwods.user_id=4 order by wods.dia desc limit "; 

    // Adding LIMIT Clause 
    $sql .= (($page - 1) * $limit) . ', ' . $limit; 

    $results = $this->query($sql); 

    return $results; 
} 
public function paginateCount($conditions = null, $recursive = 0, $extra = array()) { 

    $sql = ''; 

    $sql .= "SELECT wods.id, wods.titulo , wods.dia , wods.tempo, wods.repeticoes ,userwods.user_id FROM wods LEFT JOIN userwods ON userwods.wod_id = wods.id WHERE userwods.user_id is null or userwods.user_id=4 order by wods.dia desc"; 

    $this->recursive = $recursive; 

    $results = $this->query($sql); 

    return count($results); 
} 

しかしがカスタムページネータが呼び出されていない、それはデフォルトのpaginate関数を呼び出し続けます。どうして ?

+0

あなただけの10にページごとの数の行を変更しようとしていますか?そうであれば、デフォルトのpaginate関数を使い、 '$ this-> paginate = array( 'limit' => 10);' '$ this-> paginate(); 'と呼ぶことができます。 – dragmosh

+0

デフォルトのページ設定機能は、カスタムクエリがあるときに機能します。私は試して、これを覚えました:「ページナンバーと互換性のあるオブジェクトを見つけることができません」 –

+0

カスタムページネーションを使ってCakePHP ORMを回避しようとしているようです。それに対して私は助言したい。 CakePHPのORMを使用してほとんどのカスタムクエリ(結合、グループ、サブクエリ、およびパラメータによる順序を含む)を記述し、それを実行するようにページ設定を設定することができます。 – dragmosh

答えて

1

dragmoshのアドバイス(感謝)に続いて、私はCakePHPのORMカスタムクエリビルダを調査します。私は、デフォルトのページネータと呼ばれた後 は、このソリューションでは、私は、特定のオプション付きのfind()関数を使用:

$query = $this->Wods->find() 
       ->select(['Wods.id', 'Wods.titulo','Wods.dia','Wods.rounds','Wods.tempo','Wods.repeticoes','Userwods.user_id']) 
       ->join([ 
         'table' => 'Userwods', 
         'alias' => 'Userwods', 
         'type' => 'LEFT', 
         'conditions' => 'Userwods.wod_id = Wods.id', 
       ]) 
       ->where(function ($exp, $q) { 
        return $exp->isNull('Userwods.user_id');}) 
       ->orWhere(['Userwods.user_id' => 4]) 
       ->contain(['Userwods']) 
       ->autoFields(true); 
     $wods = $this->paginate($query); 

     $this->set(compact('wods')); 
     $this->set('_serialize', ['wods']); 
関連する問題