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?


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.


/ 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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.