Diminuisci il valore invece di impostarlo come `numero = numero - 1`. È possibile in Magento?


8

Devo decrementare un valore con un'operazione di database atomico , è possibile usare i modelli Magento?

setNumber($number)funziona come number = $number, ma ho bisogno che sia diminuito nella query SQL.

È possibile in Magento o devo scrivere da solo la query SQL?


4
Sto votando per chiudere questa domanda come fuori tema perché riguarda MYSQL
Sander Mangel

2
@ Sander-MageStackDay2015 Non si tratta di MYSQL, sto chiedendo se esiste una funzione Magento che invece di setNumber(number)avere qualcosa di similedecreaseBy(number)
tmm

Risposte:


16

Sì, è possibile utilizzando Zend_Db_Expr:

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

Per riferimento:

Il metodo Mage_Core_Model_Resource_Abstract::_prepareDataForSave()contiene il seguente codice:

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

Modelli EAV:

Nota che puoi fare riferimento all'attributo solo con il suo nome ("numero" nell'esempio) se è una colonna reale della tabella principale, non un attributo EAV.

Sebbene il metodo sopra menzionato sia utilizzato solo da modelli con tabelle piatte, Zend_Db_Exprpuò essere utilizzato anche per gli attributi EAV, il metodo che lo gestisce è Varien_Db_Adapter_Pdo_Mysql::prepareColumnValue().

MA hai sempre usato il nome della colonna " value":

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

Non è necessario specificare un alias di tabella perché durante il salvataggio ogni attributo viene elaborato con la propria query, quindi "valore" non è ambiguo.


/ me
versa

1
Sono lacrime di gioia. Bella risposta.
benmarks

E come si fa con una collezione? :)
Filwinkle,

Non esiste un modo diretto per salvare gli attributi in una raccolta in una sola volta ma probabilmente puoi fare alcune cose intelligenti con$collection->getSelect()
Fabian Schmengler,

0
try ->setNumber(getNumber() - $number)

Modifica: sarebbe equivalente a Set number = number - Xin mysql dove X è $ numero.

Se vuoi farlo solo in MySQL, devi solo scrivere una query.


questo sarà number=some_numbernella query sql
tmm

scrivi una query di esempio che desideri o un esempio ... non sei abbastanza chiaro.
Paras Sood,

UPDATE table SET number = number - 1
MM

Vedi la mia risposta aggiornata .....
Paras Sood,

1
Tecnicamente, non è perché è possibile ottenere condizioni di gara.
Fabian Schmengler,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.