Nilai penurunan alih-alih mengaturnya seperti `number = number - 1`. Apakah mungkin di Magento?

8

Saya perlu mengurangi nilai dengan operasi basis data atom , apakah mungkin menggunakan model Magento?

setNumber($number)berfungsi seperti number = $number, tapi saya perlu dikurangi dalam query SQL.

Apakah mungkin di Magento atau saya harus menulis kueri SQL sendiri?

tmm
sumber
4
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena ini tentang MYSQL
Sander Mangel
2
@ Sander-MageStackDay2015 Ini bukan tentang MYSQL, saya bertanya apakah ada fungsi Magento yang bukannya setNumber(number)memiliki sesuatu sepertidecreaseBy(number)
tmm

Jawaban:

16

Ya, itu mungkin, menggunakan Zend_Db_Expr:

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

Sebagai referensi:

Metode ini Mage_Core_Model_Resource_Abstract::_prepareDataForSave()berisi kode berikut:

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

Model EAV:

Perhatikan bahwa Anda hanya dapat mereferensikan atribut dengan namanya ("angka" dalam contoh) jika itu adalah kolom nyata dari tabel utama, bukan atribut EAV.

Meskipun metode yang disebutkan di atas hanya digunakan oleh model dengan tabel datar, Zend_Db_Exprdapat digunakan untuk atribut EAV juga, metode yang menanganinya Varien_Db_Adapter_Pdo_Mysql::prepareColumnValue().

TETAPI Anda selalu menggunakan nama kolom " value":

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

Anda tidak perlu menentukan alias tabel karena saat menyimpan setiap atribut diproses dengan kueri sendiri, jadi "nilai" tidak ambigu.

Fabian Schmengler
sumber
/ Aku menangis ...
tanda
1
Itu adalah air mata sukacita. Jawaban yang bagus
patokan
Dan bagaimana seseorang melakukan ini dengan koleksi? :)
philwinkle
Tidak ada cara langsung untuk menyimpan atribut dalam koleksi sekaligus, tetapi Anda mungkin dapat melakukan beberapa hal pintar dengan$collection->getSelect()
Fabian Schmengler
0
try ->setNumber(getNumber() - $number)

Sunting: Ini akan sama dengan Set number = number - Xdi mysql di mana X adalah $ number.

Jika Anda ingin melakukannya di MySQL saja maka Anda hanya perlu menulis kueri.

Paras Sood
sumber
ini akan berada number=some_numberdalam kueri sql
tmm
tulis kueri sampel yang Anda inginkan atau contoh ... Anda tidak cukup jelas.
Paras Sood
UPDATE table SET number = number - 1
tmm
Lihat jawaban saya yang diperbarui .....
Paras Sood
1
Secara teknis, itu bukan karena Anda bisa mendapatkan kondisi balapan.
Fabian Schmengler