Ich versuche, eine benutzerdefinierte Sammlung für ein Raster im Magento Admin-Modul zu erstellen. Ich habe eine neue Erfassungsmethode mit dem Namen "addAttributeHaving" erstellt, die nur Folgendes ausführt:
public function addAttributeHaving($value)
{
$this->getSelect()->having($value);
return $this;
}
Siehe Sammlungscode:
$collection->addFieldToSelect(
array(
'entity_id',
'created_at',
'increment_id',
'customer_email',
'customer_firstname',
'customer_lastname',
'grand_total',
'status'
)
);
$collection->getSelect()->joinLeft(array('sfop' => 'sales_flat_order_payment'), 'main_table.entity_id = sfop.parent_id', 'sfop.amount_authorized');
$collection->getSelect()->columns('sum(sfop.amount_authorized) AS AUTHD');
$collection->getSelect()->columns('grand_total - sum(sfop.amount_authorized) AS DIF_AU');
$collection->addFieldToFilter('main_table.state', array('in' => array('new','payment_review')));
$collection->addFieldToFilter('main_table.sd_order_type', array('neq' => 7));
$collection->addFieldToFilter('sfop.method', array('neq' => 'giftcard'));
$collection->addFieldToFilter('main_table.created_at', array('gt' => $this->getFilterDate()));
$collection->getSelect()->group(array('main_table.entity_id'));
$collection->addAttributeHaving('DIF_AU <> 0');
$collection->load(true,true);
$this->setCollection($collection);
Dies erzeugt das folgende SQL, das einwandfrei ausgeführt wird und die erwarteten Ergebnisse liefert, wenn es außerhalb von Magento ausgeführt wird.
[METHOD=Varien_Data_Collection_Db->printLogQuery] SELECT `main_table`.`entity_id`, `main_table`.`entity_id`, `main_table`.`created_at`, `main_table`.`increment_id`, `main_table`.`customer_email`, `main_table`.`customer_firstname`, `main_table`.`customer_lastname`, `main_table`.`grand_total`, `main_table`.`status`, `sfop`.`amount_authorized`, sum(sfop.amount_authorized) AS `AUTHD`, grand_total - sum(sfop.amount_authorized) AS `DIF_AU` FROM `sales_flat_order` AS `main_table` LEFT JOIN `sales_flat_order_payment` AS `sfop` ON main_table.entity_id = sfop.parent_id WHERE (main_table.state in ('new', 'payment_review')) AND (main_table.sd_order_type != 7) AND (sfop.method != 'giftcard') AND (main_table.created_at > '2013-04-07') GROUP BY `main_table`.`entity_id` HAVING (DIF_AU <> 0)
Wenn ich jedoch versuche, das Raster in Magento zu laden, wird folgende Fehlermeldung angezeigt:
SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte 'DIF_AU' in 'having clause'
Wenn ich außerdem die having-Klausel entferne (die meine Ergebnisse beeinträchtigt), kann ich die DIF_AU-Spalte für eine Datenquelle im Grid verwenden.
quelle
sd_order_type
her?Antworten:
Ich werde hier meine eigene Frage beantworten. Ich weiß, klebrig, aber ich bin auf die Antwort gestoßen, als ich mir die eigentliche Stapelspur genauer angesehen habe. Die Auflistung wird problemlos geladen , der Fehler tritt jedoch etwas später bei der Ausführung auf, wenn wir versuchen, die Anzahl der Auflistungen in Varien_Data_Collection_Db :: getSelectCountSql () abzurufen . Die SQL, die daraus erzeugt wird, ist:
SELECT COUNT(*) FROM sales_flat_order AS main_table LEFT JOIN sales_flat_order_payment AS sfop ON main_table.entity_id = sfop.parent_id WHERE (main_table.state in ('payment_review')) AND (main_table.sd_order_type != 7) AND (sfop.method != 'giftcard') AND (main_table.created_at > '2013-04-07') GROUP BY main_table.entity_id HAVING (DIF_AU <> 0)
Sie werden feststellen, dass die HAVING-Anweisung angehängt ist, wir jedoch keine Definition für die DIF_AU-Spalte mehr haben. Es sieht so aus, als müsste ich ein benutzerdefiniertes getSelectCountSql () in meiner Auflistungsklasse erweitern, um die richtige Datensatzanzahl zu erhalten.
Ich habe ein erweitertes getSelectCountSql () in der benutzerdefinierten Auflistungsklasse erstellt, das in der fehlenden Spalte, die für die having-Anweisung erforderlich ist, wieder hinzugefügt wird.
quelle
count(distinct main_table.entity_id)
stattcount(*)
Zunächst
$countSelect->reset(Zend_Db_Select::HAVING);
bedeutet dies, dass esHAVING
aus Ihrer Sammlung zurückgesetzt wird. Das heißt, es wird die having-Klausel entfernen. Und es ist nicht das, was du willst. Möglicherweise möchten Sie es der Sammlung hinzufügen (app/code/core/Mage/Catalog/Model/Resource/Product/Collection.php->_getSelectCountSql()
hier.)Aber der Hauptschuldige ist die
getSize()
Methode, die in derlib/Varien/Data/Collection/Db.php
Datei existiert .Jetzt habe ich das Folgende getan.
Überprüfen Sie, dass ich nicht einmal das verwende
getSelectCountSql()
. Ich lese gerade die gesamte SQL - Abfrage und alle Daten zu holen und geben die Zählung davon. Das ist alles.quelle
Ich habe dieses Problem hier behoben: app / code / core / Mage / Catalog / Model / Resource / Product / Collection.php: 943 füge dies hinzu: $ select-> reset (Zend_Db_Select :: HAVING);
Kopieren Sie einfach app / code / core / Mage / Catalog / Model / Resource / Product / Collection.php nach app / code / local / Mage / Catalog / Model / Resource / Product / Collection.php
Mein Code sieht jetzt so aus:
quelle
Unterabfrage: Tabellenunterabfrage erlaubt doppelte Spaltennamen
quelle
Das funktioniert
öffentliche Funktion getSize () {if (is_null ($ this -> _ totalRecords)) {// $ sql = $ this-> getSelectCountSql (); $ sql = $ this-> getSelect (); $ this -> _ totalRecords = count ($ this-> getConnection () -> fetchAll ($ sql, $ this -> _ bindParams)); } return intval ($ this -> _ totalRecords); }
quelle