Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kann ich eine benutzerdefinierte Abfrage paginieren, ohne die Standard-Paginierung zu überschreiben?

Eigentlich, wenn Sie es mit find tun können, können Sie es mit paginate tun. Sie können hier nachsehen

Aber um genauer zu sein, können Sie die Bedingungen/Limit/Felder/enthalten/Reihenfolge usw., die Sie in find verwenden, zur Paginierungsfunktion hinzufügen.

Ich habe keine Gruppe in der Paginierung verwendet, aber es SOLLTE funktionieren :D

In Ihrem Fall haben Sie so etwas:

$this->paginate = array(
   'fields' => array(
        'Product.category_id',
        'COUNT(Product.hotel_id) as total'
    ),
   'group' => array(
        'Product.category_id HAVING COUNT(Product.hotel_id) > 1')
    )
);

$data = $this->paginate('Product');

Hoffe, es funktioniert, posten Sie einen Kommentar zu Ihrem Ergebnis, wenn es nicht funktioniert, müssen Sie es überschreiben, weil es die Gruppenbedingung nicht akzeptiert ... obwohl ich denke, dass es funktionieren wird, da die Paginierung am Ende ein Fund ist.

BEARBEITEN:

Sie können versuchen, Folgendes zu tun:

Überschreiben Sie paginate() und paginateCount(), aber schleichen Sie mit einem Tweak eine Bedingung ein, damit Sie feststellen können, ob es sich um eine Paginierung mit Haben handelt oder nicht. Etwa so:

function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()){
   //if no having conditions set return the parent paginate 
   if (empty($conditions['having'])
       return parent::paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra)
   //if having conditions set return your override

//override code here

}

Dann machen Sie etwas Ähnliches in paginateCount(), auf diese Weise haben Sie eine selektive Paginierung. Denken Sie daran, $conditions['having'] zurückzusetzen, wenn es nicht benötigt wird, oder denken Sie daran, es an einer Stelle zu platzieren, die Ihren Fund nicht beeinflusst;)