Ich habe die Methode getListQuery () in meinem Modell, die eine Abfrage zurückgibt. Wie wir wissen, hat Joomla bei Verwendung von JPagination automatisch Limit und Offset für die Abfrage festgelegt. Ich habe ein Problem, dass ich JPagination verwenden und alle Zeilen in getListQuery () abrufen möchte. Soweit habe ich Code wie geschrieben
protected function getListQuery(){
// here is created my $query object with query
// I'm fetching all rows
$rows = $db->loadObjectList();
$this->rows = $rows;
return $query;
}
Dies bedeutet, dass die Abfrage zweimal ausgeführt wird: eine von mir in dieser Methode und eine von Joomla Core. Ich bin mit dieser Lösung nicht so zufrieden, da sie das Laden von Seiten zweimal länger verursacht. Die Abfrage hat ungefähr 10 Verknüpfungen ... Bei Millionen von Zeilen ist das wirklich ein Problem. Sehen Sie eine richtige Lösung?
quelle
$this->_items
in diesem Fall?Joomla sollte verwenden
getItems
, um die Abfrage auszuführen. Am besten ändern Sie den Status des Modells, um sicherzustellen, dass alle Ergebnisse geladen werden.Innerhalb des Modells können Sie dies folgendermaßen tun
setState
:Führen Sie dies aus, bevor das Modell getItems aufruft, und es lädt alle Elemente für Sie.
Ein paar Vorbehalte dazu.
Sie können dies auch außerhalb des Modells tun, wenn Sie beispielsweise in Ihrer Ansicht waren. Sie können Folgendes tun:
$ model = $ this-> getModel (); $ model-> setState ('list.limit', 0);
Manchmal können Sie dies zu früh tun, bevor der Status des Modells ausgefüllt wurde. Dies führt dazu, dass das Modell aus dem Benutzerstatus wiederhergestellt wird, nachdem Sie das Limit festgelegt haben, wodurch das Limit im Wesentlichen überschrieben wird.
Um dies zu beheben, können Sie das Modell zwingen, zuerst seinen Status zu füllen:
Die eigentliche
populateState
Methode ist geschützt, sodass Sie sie außerhalb des Modells nicht direkt aufrufen können. Bei jedem Aufruf vongetState
wird jedoch sichergestellt, dass die MethodepopulateState
aufgerufen wird, bevor die aktuellen Einstellungen im Status zurückgegeben werden.quelle
$this->model = $this->getModel(); $this->model->getState(); $this->model->setState('list.limit', 0); $this->pagination = $this->get('Pagination'); $this->items = $this->get('Items'); $this->state = $this->get('State');
Es bewirkt, dass die Abfrage alle Zeilen auf einer Seite