递减值,而不是像`number = number-1`这样设置。Magento有可能吗?


8

我需要使用原子数据库操作递减值可以使用Magento模型吗?

setNumber($number)的工作方式类似于number = $number,但我需要在SQL查询中将其减少。

Magento是否有可能,还是我必须自己编写SQL查询?


4
我投票结束这个话题是因为题外话,因为它与MYSQL有关
Sander Mangel

2
@ Sander-MageStackDay2015这与MYSQL无关,我在问是否有Magento函数而不是setNumber(number)类似的函数decreaseBy(number)
tmm 2015年

Answers:


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'));

您无需指定表别名,因为在保存期间,每个属性都将使用其自己的查询进行处理,因此“值”并不明确。


/ me
流下

1
他们是喜悦的眼泪。好答案。
benmarks 2015年

以及如何做到这一点呢?:)
philwinkle 2015年

没有直接将属性立即保存在集合中的直接方法,但是您可能可以使用以下方法做一些聪明的事$collection->getSelect()
Fabian Schmengler,2015年

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

编辑:这将等效Set number = number - X于mysql中X是$ number。

如果只想在MySQL中执行此操作,则只需要编写查询即可。


这将number=some_number在sql查询中
tmm 2015年

编写您想要的示例查询或示例...您还不够清楚。
Paras Sood 2015年

UPDATE table SET number = number - 1
tmm 2015年

请参阅我更新的答案.....
Paras Sood 2015年

1
从技术上讲,这不是因为您可以获得比赛条件。
Fabian Schmengler,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.