Reduza o valor em vez de defini-lo como `number = number - 1`. É possível no Magento?

8

Eu preciso diminuir um valor com uma operação de banco de dados atômica , é possível usar modelos Magento?

setNumber($number)funciona como number = $number, mas eu preciso que ele seja diminuído na consulta SQL.

É possível no Magento ou eu mesmo tenho que escrever a consulta SQL?

tmm
fonte
4
Estou votando para encerrar esta questão como fora de tópico, porque se trata de MYSQL
Sander Mangel
2
@ Sander-MageStackDay2015 Não é sobre MYSQL, estou perguntando se existe uma função Magento que em vez de setNumber(number)tem algo comodecreaseBy(number)
tmm

Respostas:

16

Sim, é possível, usando Zend_Db_Expr:

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

Para referência:

O método Mage_Core_Model_Resource_Abstract::_prepareDataForSave()contém o seguinte 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:

Observe que você só pode fazer referência ao atributo por seu nome ("número" no exemplo) se for uma coluna real da tabela principal, não um atributo EAV.

Embora o método acima mencionado seja usado apenas por modelos com tabelas planas, também Zend_Db_Exprpode ser usado para atributos EAV, o método que lida com isso é Varien_Db_Adapter_Pdo_Mysql::prepareColumnValue().

MAS você sempre usa o nome da coluna " value":

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

Você não precisa especificar um alias de tabela porque, durante o salvamento, cada atributo é processado com sua própria consulta, portanto, "value" não é ambíguo.

Fabian Schmengler
fonte
/ me derrama uma lágrima ...
benmarks 17/02/2015
11
São lágrimas de alegria. Ótima resposta.
benmarks 17/02/15
E como se faz isso com uma coleção? :)
philwinkle
Não há nenhuma maneira direta para salvar atributos de uma coleção de uma só vez, mas provavelmente você pode fazer algumas coisas inteligente com$collection->getSelect()
Fabian Schmengler
0
try ->setNumber(getNumber() - $number)

Edit: Isso seria equivalente Set number = number - Xno mysql, onde X é $ number.

Se você quiser fazê-lo apenas no MySQL, basta escrever uma consulta.

Paras Sood
fonte
isso estará number=some_numberna consulta sql
tmm
escreva uma consulta de amostra que você deseja ou um exemplo ... você não é suficientemente claro.
Paras Sood
UPDATE table SET number = number - 1
tmm 17/02/2015
Veja minha resposta atualizada .....
Paras Sood
11
Tecnicamente, não é porque você pode obter condições de corrida.
Fabian Schmengler