2016-03-21 17 views
0

ich eine benutzerdefinierte Abfrage zu erstellen und versucht, die Standard-paginator verwenden, wie folgt aus:CakePHP benutzerdefinierte Abfrage paginator: custom Paginieren Funktion wird aufgerufen, nicht

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']); 

ich diesen Fehler bekam „Kann nicht suche ein mit paginate kompatibles Objekt ".

Jetzt versuche ich benutzerdefinierte Abfrage Paginator implementieren, aber es funktioniert nicht. Ich habe die Funktionen paginate und paginateCount im Modell implementiert. Wods.php Datei:

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); 
} 

In der Steuerung WodsController.php

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

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

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

Aber der Brauch paginator nicht aufgerufen wird, setzt es die Standard Paginieren Funktion aufrufen. Warum ?

+0

Wollen Sie nur die Anzahl Zeilen pro Seite 10 ändern? Wenn ja, können Sie die Standardfunktion paginate verwenden und einfach '$ this-> paginate = array ('limit' => 10);' Und rufen Sie es mit '$ this-> paginate();' – dragmosh

+0

Mein Problem mit der Standard-Paginator macht es funktioniert, wenn ich eine benutzerdefinierte Abfrage habe. Ich habe es versucht und habe Folgendes erhalten: "Das mit paginate kompatible Objekt konnte nicht gefunden werden" –

+0

Es sieht so aus, als ob Sie die benutzerdefinierte Paginierung verwenden möchten, um das CakePHP ORM zu umgehen. Ich würde davon abraten. Sie können die meisten benutzerdefinierten Abfragen (einschließlich Joins, Gruppen, Unterabfragen und Reihenfolge nach Parametern) mit dem ORM von CakePHP schreiben und den Paginator für die Ausführung festlegen. – dragmosh

Antwort

1

Nach dragmosh beraten (danke), untersuche ich CakePHP ORM benutzerdefinierte Abfragen Builder. In dieser Lösung, die ich find() Funktion mit bestimmten Optionen verwendet, nachdem ich den Standard-paginator genannt:

$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']); 
Verwandte Themen