Dekrementieren Sie den Wert, anstatt ihn wie "number = number - 1" zu setzen. Ist es in Magento möglich?

8

Ich muss einen Wert mit einer atomaren Datenbankoperation dekrementieren. Ist es möglich, Magento-Modelle zu verwenden?

setNumber($number)funktioniert wie number = $number, aber ich muss es in SQL-Abfrage dekrementiert werden.

Ist es in Magento möglich oder muss ich die SQL-Abfrage selbst schreiben?

tmm
quelle
4
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da es sich um MYSQL handelt
Sander Mangel
2
@ Sander-MageStackDay2015 Es geht nicht um MYSQL, ich frage, ob es eine Magento-Funktion gibt, die statt setNumber(number)so etwas wiedecreaseBy(number)
tmm

Antworten:

16

Ja, es ist möglich mit Zend_Db_Expr:

$object->setNumber(new Zend_Db_Expr('number-1'));

Als Referenz:

Die Methode Mage_Core_Model_Resource_Abstract::_prepareDataForSave()enthält den folgenden Code:

if ($object->hasData($field)) {
    $fieldValue = $object->getData($field);
    if ($fieldValue instanceof Zend_Db_Expr) {
        $data[$field] = $fieldValue;
    } else {
        ... [normal value processing follows]

EAV-Modelle:

Beachten Sie, dass Sie das Attribut nur anhand seines Namens (im Beispiel "Nummer") referenzieren können, wenn es sich um eine echte Spalte der Haupttabelle handelt, nicht um ein EAV-Attribut.

Obwohl die oben genannte Methode nur von Modellen mit flachen Tabellen verwendet wird, Zend_Db_Exprkann sie auch für EAV-Attribute verwendet werden Varien_Db_Adapter_Pdo_Mysql::prepareColumnValue().

ABER Sie haben immer den Spaltennamen " value" verwendet:

$product->setNumber(new Zend_Db_Expr('value-1'));

Sie müssen keinen Tabellenalias angeben, da jedes Attribut beim Speichern mit einer eigenen Abfrage verarbeitet wird, sodass "Wert" nicht mehrdeutig ist.

Fabian Schmengler
quelle
/ Ich
vergieße
1
Sie sind Freudentränen. Gute Antwort.
Benmarks
Und wie macht man das mit einer Sammlung? :)
Philwinkle
Es gibt keine direkte Möglichkeit, Attribute auf einmal in einer Sammlung zu speichern, aber Sie können wahrscheinlich einige clevere Dinge tun$collection->getSelect()
Fabian Schmengler
0
try ->setNumber(getNumber() - $number)

Bearbeiten: Dies entspricht Set number = number - Xin MySQL, wobei X $ number ist.

Wenn Sie dies nur in MySQL tun möchten, müssen Sie nur eine Abfrage schreiben.

Paras Sood
quelle
Dies wird number=some_numberin SQL-Abfrage sein
tmm
Schreiben Sie eine gewünschte Beispielabfrage oder ein Beispiel ... Sie sind nicht klar genug.
Paras Sood
UPDATE table SET number = number - 1
tmm
Siehe meine aktualisierte Antwort .....
Paras Sood
1
Technisch gesehen liegt es nicht daran, dass man Rennbedingungen bekommen kann.
Fabian Schmengler