J'ai besoin de décrémenter une valeur avec une opération de base de données atomique , est-il possible d'utiliser des modèles Magento?
setNumber($number)
fonctionne comme number = $number
, mais j'ai besoin qu'il soit décrémenté dans la requête SQL.
Est-il possible dans Magento ou dois-je écrire la requête SQL moi-même?
setNumber(number)
avoir quelque chose commedecreaseBy(number)
Réponses:
Oui, c'est possible en utilisant
Zend_Db_Expr
:Pour référence:
La méthode
Mage_Core_Model_Resource_Abstract::_prepareDataForSave()
contient le code suivant:Modèles EAV:
Notez que vous ne pouvez référencer l'attribut que par son nom ("numéro" dans l'exemple) si c'est une vraie colonne de la table principale, pas un attribut EAV.
Bien que la méthode susmentionnée ne soit utilisée que par les modèles avec des tables plates, elle
Zend_Db_Expr
peut également être utilisée pour les attributs EAV, la méthode qui la gèreVarien_Db_Adapter_Pdo_Mysql::prepareColumnValue()
.MAIS vous devez toujours utiliser le nom de colonne "
value
":Vous n'avez pas besoin de spécifier un alias de table car lors de l'enregistrement, chaque attribut est traité avec sa propre requête, donc "valeur" n'est pas ambiguë.
la source
$collection->getSelect()
Edit: Ce serait équivalent à
Set number = number - X
dans mysql où X est $ nombre.Si vous voulez le faire uniquement dans MySQL, il vous suffit d'écrire une requête.
la source
number=some_number
en requête sqlUPDATE table SET number = number - 1