Sử dụng ORM của Magento để chèn Trường ID cụ thể


14

Có cách nào để sử dụng ORM ( Mage_Core_Model_AbstractMage_Core_Model_Resource_Abstract) đơn giản của Magento để chèn các hàng mô hình với một khóa chính cụ thể không?

Ví dụ: nếu tôi chạy như sau với hệ thống Magento trống

Mage::getModel('core/website')->setData(array (
    'website_id' => 2,
    'code' => 'foo',
    'name' => 'Main Website',
    'sort_order' => 0,
    'default_group_id' => 1,
    'is_default' => 1,
)); 

Tôi mong đợi một mục mới trong core_websitebảng. Tuy nhiên, Magento âm thầm không làm gì ở đây.

Đi sâu vào tài nguyên, có vẻ như tôi đang thất vọng về điều này trong lớp tài nguyên cơ sở dữ liệu

#File: app/code/core/Mage/Core/Model/Resource/Db/Abstract.php
if (!is_null($object->getId()) && (!$this->_useIsObjectNew || !$object->isObjectNew())) {
    //update stuff here
}
else
{
    //insert stuff here
}

Bởi vì mô hình có một id (tức là tôi đang chèn một ID cụ thể) và vì _useIsObjectNewđược mã hóa cứng thành false, yêu cầu lưu của tôi luôn được chuyển đến insertđường dẫn.

Có cách nào để buộc chèn với các mô hình Magento mặc định không? (không có viết lại / thay thế lớp).

Đúng, SQL thô là một tùy chọn, nhưng sau đó chức năng sự kiện bị mất.


Tại sao bạn lại cố gắng gán ID cho trường tự động? Nếu đây là một phụ thuộc xuôi dòng, bạn không nên tạo bản ghi và sau đó truy xuất PK được tạo tự động?
Ralph Tice

@RalphTice Vâng, đó có lẽ là điều đúng đắn để sử dụng hàng ngày.
Alan Storm

Câu trả lời:


5

Vì vậy, vâng. ( chỉnh sửa :) Thủ thuật là sử dụng một Mage_Core_Model_Abstractlớp con không có trường id mà mô hình tài nguyên mong đợi:

$evil = Mage::getModel('core/store'); // that's a store object, baby!
$evil->setData(
    array (
        'website_id' => 99,
        'code' => 'foo',
        'name' => 'Main Website9',
        'sort_order' => 0,
        'default_group_id' => 1,
        'is_default' => 1,
    )
);

Mage::getResourceModel('core/website')->forsedSave($evil);

Mage::dispatchEvent('website_save_commit_after', [...])chỉ là sự kiện tôi thấy được tiêu thụ trong cốt lõi. Nó có thể đơn giản như sau với

Mage::getModel('core/website')->setData($evil->getData())->afterCommitCallback();

Trong mọi trường hợp, tôi cần tắm.


1
Khi bạn đã sạch - Tôi không chắc chắn mình làm theo điều đó - có một kiểm tra id tương tự trong forsedSave gist.github.com/astorm/5219357 . Điều này có hiệu quả với bạn không, hay nó chỉ là một lý thuyết?
Alan Storm

Chỉnh sửa câu trả lời của tôi để làm cho nó rõ ràng hơn.
đánh dấu

... Và nó đã làm việc cho tôi.
đánh dấu

Ah ha, đó là những gì tôi nhận được khi nhập mã của riêng mình thay vì sao chép và dán. Sử dụng điều này như một điểm khởi đầu, bạn có thể thấy bất kỳ lý do nào để không sử dụng Varien_Objectthay thế cho lớp mô hình khác nhau và sau đó gọi savephương thức không khấu hao của tài nguyên không ?
Alan Storm

Và trả lời câu hỏi của riêng tôi ở trên, đó là vì phương thức lưu của tài nguyên chung có Mage_Core_Model_Abstractkiểu gợi ý cho mảng dữ liệu.
Alan Storm
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.