`number = number-1`のように設定するのではなく、値を減らします。Magentoで可能ですか?


8

アトミックデータベース操作で値をデクリメントする必要があります。Magentoモデルを使用して可能ですか?

setNumber($number)のようnumber = $numberに動作しますが、SQLクエリでデクリメントする必要があります。

Magentoで可能ですか、それともSQLクエリを自分で作成する必要がありますか?


4
これはMYSQLに関する問題であるため、トピック外としてこの質問を閉じることに投票します
Sander Mangel

2
@ Sander-MageStackDay2015それはMYSQLについてでsetNumber(number)はなく、代わりに次のようなものを持つMagento関数があるかどうかを尋ねています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'));

保存中に各属性は独自のクエリで処理されるため、「値」があいまいではないため、テーブルエイリアスを指定する必要はありません。


/ me涙を流す...
ベンマークス2015

1
彼らは喜びの涙です。すばらしい答えです。
ベンマークス2015

そして、これをコレクションでどのように行うのですか?:)
philwinkle 2015

一度にコレクションに属性を保存する直接的な方法はありませんが、おそらくいくつかの賢いことを行うことができます$collection->getSelect()
Fabian Schmengler

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

編集:これはSet number = number - X、Xが$ numberであるmysql と同等です。

MySQLでのみ実行する場合は、クエリを記述するだけです。


これはnumber=some_numberSQLクエリに含まれます
tmm

必要なサンプルクエリまたは例を記述してください...十分に明確ではありません。
Paras Sood

UPDATE table SET number = number - 1
2015

私の更新の答え.....参照してください
パラスSood氏

1
技術的には、競合状態を取得できるからではありません。
Fabian Schmengler、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.