Giá trị giảm thay vì đặt nó như `number = number - 1`. Có thể có trong Magento?


8

Tôi cần giảm giá trị với hoạt động cơ sở dữ liệu nguyên tử , có thể sử dụng các mô hình Magento không?

setNumber($number)hoạt động như thế number = $number, nhưng tôi cần nó được giảm dần trong truy vấn SQL.

Có thể trong Magento hay tôi phải tự viết truy vấn SQL?


4
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì đó là về MYSQL
Sander Mangel

2
@ Sander-MageStackDay2015 Không phải về MYSQL, tôi đang hỏi liệu có chức năng Magento nào thay vì setNumber(number)có một cái gì đó nhưdecreaseBy(number)
tmm

Câu trả lời:


16

Có, nó có thể, sử dụng Zend_Db_Expr:

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

Để tham khảo:

Phương thức Mage_Core_Model_Resource_Abstract::_prepareDataForSave()chứa mã sau đây:

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

Mô hình EAV:

Lưu ý rằng bạn chỉ có thể tham chiếu thuộc tính theo tên của nó ("số" trong ví dụ) nếu đó là cột thực của bảng chính, không phải là thuộc tính EAV.

Mặc dù phương thức nêu trên chỉ được sử dụng bởi các mô hình có bảng phẳng, nhưng Zend_Db_Exprcũng có thể được sử dụng cho các thuộc tính EAV, nhưng phương thức xử lý nó là Varien_Db_Adapter_Pdo_Mysql::prepareColumnValue().

NHƯNG bạn luôn luôn sử dụng tên cột " value":

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

Bạn không cần chỉ định bí danh bảng vì trong quá trình lưu, mỗi thuộc tính được xử lý bằng truy vấn riêng, vì vậy "giá trị" không mơ hồ.


/ tôi rơi nước mắt ...
đánh dấu

1
Họ là những giọt nước mắt của niềm vui. Câu trả lời chính xác.
đánh dấu

Và làm thế nào để làm điều này với một bộ sưu tập? :)
philwinkle 17/2/2015

Không có cách trực tiếp để lưu thuộc tính trong bộ sưu tập cùng một lúc nhưng bạn có thể có thể thực hiện một số công cụ thông minh với$collection->getSelect()
Fabian Schmengler 17/2/2015

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

Chỉnh sửa: Điều này sẽ tương đương với Set number = number - Xtrong mysql trong đó X là $ number.

Nếu bạn chỉ muốn làm điều đó trong MySQL thì bạn chỉ cần viết một truy vấn.


điều này sẽ có number=some_numbertrong truy vấn sql
tmm

viết một truy vấn mẫu bạn muốn hoặc một ví dụ ... bạn không đủ rõ ràng.
Paras Sood

UPDATE table SET number = number - 1
tmm

Xem câu trả lời cập nhật của tôi .....
Paras Sood

1
Về mặt kỹ thuật, không phải vì bạn có thể có được điều kiện đua.
Fabian Schmengler 17/2/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.