Frage

Wie kann ich diese unsichere, hässliche Abfrage nach dem Magento -Weg schreiben, ohne die Sammlung zu verwenden?

select (select sum(points) FROM ".$this->getTable('mymodule/registry')." where points < 0 and entity_id=".$customerId.") as points_spent,
(select sum(points) FROM ".$this->getTable('mymodule/registry')." where points > 0  and entity_id=".$customerId.") as points_received,
(select sum(points) FROM ".$this->getTable('mymodule/registry')."  where entity_id=".$customerId.") as points_current

BEARBEITEN

Eine mögliche Lösung.

In einem Ressourcenmodell kann ich so etwas setzen:

$adapter = $this->_getReadAdapter();

        $receivedPoints = $adapter->select()
            ->from(array('mymodule/registry'), array(new Zend_Db_Expr('sum(points)')))
            ->where('points > ?', 0)
            ->where('entity_id = ?', $customerId);

        $spentPoints = $adapter->select()
            ->from(array('mymodule/registry'), array(new Zend_Db_Expr('sum(points)')))
            ->where('points < ?', 0)
            ->where('entity_id = ?', $customerId);

        $query = $adapter->select()
            ->from(
                array('mymodule/registry'),
                array('current_points'  => new Zend_Db_Expr('sum(points)'),
                      'received_points' => new Zend_Db_Expr('(' . $receivedPoints . ')'),
                      'spent_points'    => new Zend_Db_Expr('(' . $spentPoints . ')')
                )
            )
            ->where('entity_id = ?', $customerId);
        return $adapter->fetchRow($query);
War es hilfreich?

Lösung

Versuchen Sie, diese Funktion Ihrer Sammelklasse hinzuzufügen. Meine Logik ist, dass Sie die Summe der Punkte haben, die nach 0 und mehr von 0 und allen von ihnen gruppieren.

class My_Module_Model_Mysql4_Registry_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
    public function _construct()
    {
        $this->_init('mymodule/registry');
    }

    public function getSumOfPoints($customerId)
    {
        $this->addFieldToFilter('customer_id', $customerId);

        $this->getSelect()
            ->reset('columns')
            ->columns(new Zend_Db_Expr("sign(points) as sign"))
            ->columns(new Zend_Db_Expr("sum(points) as summ"))
            ->group(new Zend_Db_Expr("sign(points)"));
        return $this;
    }
}

Und Sie können Ergebnisse erzielen, indem Sie diese Funktion an einem überall aufrufen:

$results = Mage::getResourceModel('mymodule/registry_collection')->getSumOfPoints($customerId);
foreach ($results as $result) {
    print_r($result->getData());
}

Wenn Sie alles richtig einstellen, gibt es ein Ergebnis wie diese:

Array
(
    [sign] => -1 //summ of points less than 0
    [summ] => -166
)
Array
(
    [sign] => 1 //summ of points great than 0
    [summ] => 312
)

Sie können alle Punkte beschwören, die oben zwei Ergebnisse hinzufügen. Wenn Sie keine Sammelklasse verwenden möchten, können Sie diese Logik für Ihren eigenen Code übernehmen, der das Ressourcenmodell verwendet. Die Sammlungsklasse generiert die unten angegebene SQL -Abfrage. Versuchen Sie zuerst diese Abfrage. Wenn Sie ein entsprechendes Ergebnis liefern, können Sie den oben angegebenen Code verwenden:

SELECT
    sign(points)AS sign,
    sum(points)AS summ
FROM
    `mymodule_registry` AS `main_table` //put here real table name
WHERE
    (customer_id = '4') //put real customer id
GROUP BY
    sign(points)

Andere Tipps

Am Ende des Tages stützt sich dieser Teil von Magento auf Zend_db, Also, wonach Sie suchen, ist: Zend_db_select. lib/Varien (und in einer neueren Magento -Version lib/Magento) erweitert diesen Teil.

Das für Auswahl verwendete Objekt ist Variien_db_select das erstreckt sich Zend_Db_Select

 $db = Mage::getSingleton('core/resource')->getConnection('core_read');//(Magento|Varien)_Db_Adapter_Pdo_Mysql
    $db->select();
    //does:
    public function select()
    {
        return new Varien_Db_Select($this);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top