Уменьшите значение вместо того, чтобы устанавливать его как `число = число - 1`. Возможно ли это в Magento?

8

Мне нужно уменьшить значение с помощью атомарной операции с базой данных , возможно ли использование моделей Magento?

setNumber($number)работает как number = $number, но мне нужно, чтобы это было уменьшено в запросе SQL.

Возможно ли это в Magento или мне нужно самому написать SQL-запрос?

ТММ
источник
4
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что речь идет о MYSQL
Сандер Мангель
2
@ Sander-MageStackDay2015 Речь идет не о MYSQL, я спрашиваю, есть ли функция Magento, которая вместо setNumber(number)имеет что-то вродеdecreaseBy(number)
tmm

Ответы:

16

Да, это возможно, используя Zend_Db_Expr:

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

Для справки:

Метод Mage_Core_Model_Resource_Abstract::_prepareDataForSave()содержит следующий код:

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

Модели EAV:

Обратите внимание, что вы можете ссылаться на атрибут только по имени (в данном примере это «число»), если это реальный столбец главной таблицы, а не атрибут EAV.

Хотя вышеупомянутый метод используется только в моделях с плоскими таблицами, он Zend_Db_Exprможет быть использован и для атрибутов EAV, метод, который его обрабатывает Varien_Db_Adapter_Pdo_Mysql::prepareColumnValue().

НО вы всегда должны использовать имя столбца " value":

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

Вам не нужно указывать псевдоним таблицы, потому что при сохранении каждый атрибут обрабатывается с помощью собственного запроса, поэтому «значение» не является неоднозначным.

Фабиан Шменглер
источник
/ я
пролил
1
Это слезы радости. Отличный ответ.
отметки
И как это сделать с коллекцией? :)
philwinkle
Не существует прямого способа сохранить атрибуты в коллекции сразу, но вы, вероятно, можете сделать кое-что умное$collection->getSelect()
Фабиан Шменглер,
0
try ->setNumber(getNumber() - $number)

Изменить: Это будет эквивалентно Set number = number - Xв MySQL, где X является $ число.

Если вы хотите сделать это только в MySQL, вам просто нужно написать запрос.

Парас Суд
источник
это будет number=some_numberв sql запросе
tmm
напишите пример запроса, который вы хотите, или пример ... вы не достаточно ясны.
Paras Sood
UPDATE table SET number = number - 1
ТММ
Смотрите мой обновленный ответ .....
Paras Sood
1
Технически, это не потому, что вы можете получить условия гонки.
Фабиан Шменглер