Disminuya el valor en lugar de configurarlo como `número = número - 1`. ¿Es posible en Magento?

8

Necesito disminuir un valor con una operación de base de datos atómica , ¿es posible usar modelos Magento?

setNumber($number)funciona como number = $number, pero necesito que se disminuya en la consulta SQL.

¿Es posible en Magento o tengo que escribir yo mismo la consulta SQL?

tmm
fuente
44
Estoy votando para cerrar esta pregunta como fuera de tema porque se trata de MYSQL
Sander Mangel
2
@ Sander-MageStackDay2015 No se trata de MYSQL, estoy preguntando si hay una función de Magento que en lugar de setNumber(number)tener algo comodecreaseBy(number)
tmm

Respuestas:

16

Sí, es posible, usando Zend_Db_Expr:

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

Para referencia:

El método Mage_Core_Model_Resource_Abstract::_prepareDataForSave()contiene el siguiente código:

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

Modelos EAV:

Tenga en cuenta que solo puede hacer referencia al atributo por su nombre ("número" en el ejemplo) si es una columna real de la tabla principal, no un atributo EAV.

Aunque el método mencionado anteriormente solo se usa en modelos con tablas planas, también Zend_Db_Exprse puede usar para atributos EAV, el método que lo maneja es Varien_Db_Adapter_Pdo_Mysql::prepareColumnValue().

PERO siempre has usado el nombre de columna " value":

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

No necesita especificar un alias de tabla porque durante el guardado cada atributo se procesa con su propia consulta, por lo que el "valor" no es ambiguo.

Fabian Schmengler
fuente
/ me derrama una lágrima ...
puntos de referencia
1
Son lágrimas de alegría. Gran respuesta.
puntos de referencia
¿Y cómo se hace esto con una colección? :)
philwinkle
No hay una forma directa de guardar atributos en una colección a la vez, pero probablemente pueda hacer algunas cosas inteligentes con$collection->getSelect()
Fabian Schmengler
0
try ->setNumber(getNumber() - $number)

Editar: Esto sería equivalente a Set number = number - Xen mysql donde X es $ número.

Si desea hacerlo solo en MySQL, solo necesita escribir una consulta.

Paras Sood
fuente
esto será number=some_numberen consulta SQL
tmm
escribe una consulta de muestra que quieras o un ejemplo ... no eres lo suficientemente claro.
Paras Sood
UPDATE table SET number = number - 1
tmm
Ver mi respuesta actualizada .....
Paras Sood
1
Técnicamente, no es porque puedas obtener condiciones de carrera.
Fabian Schmengler