Використання ORM Magento для вставки конкретного поля ідентифікатора


14

Чи є спосіб використовувати простий ORM Magento ( Mage_Core_Model_Abstractі Mage_Core_Model_Resource_Abstract) для вставки рядків моделей із певним первинним ключем?

Наприклад, якщо я запустив наступне проти порожньої системи Magento

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

Я очікую нового запису в core_websiteтаблиці. Однак Магенто мовчки тут нічого не робить.

Копаючись у ресурсі, схоже, я потрапляю до цього у класі ресурсів бази даних

#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
}

Оскільки модель має ідентифікатор (тобто я вставляю певний ідентифікатор), а тому _useIsObjectNew, що важко закодовано до помилки, мій запит на збереження завжди спрямовується на insertшлях.

Чи є спосіб змусити вставити за допомогою стандартних моделей Magento? (без перезапису / заміни класу).

Так, необроблений SQL - це варіант, але тоді функціональність подій втрачається.


Чому ви намагаєтеся призначити ідентифікатор в полі самовдосконалення? Якщо це залежність від нижньої течії, чи не слід просто створити запис і потім отримати автогенеровану ПК?
Ральф Тіс

@RalphTice Так, це, мабуть, було б правильною справою для щоденного використання.
Алан Шторм

Відповіді:


5

Так, так. ( редагувати :) Хитрість полягає у використанні Mage_Core_Model_Abstractпідкласу, у якому немає поля id, якого очікує модель ресурсу:

$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', [...])це лише подія, яку я бачу, що її споживають в основному. Це може бути таким же простим, як і наступне

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

У будь-якому випадку мені потрібен душ.


1
Як тільки ви чисті - я не впевнений, що дотримуюся цього - є аналогічна перевірка ідентифікації в forsedSave gist.github.com/astorm/5219357 . Це працювало для вас, чи це просто теорія?
Алан Шторм

Відредагував мою відповідь, щоб зробити її більш очевидною.
орієнтири

... і це спрацювало для мене.
орієнтири

А-ха, ось що я отримую за те, щоб набрати власний код, а не копіювати та вставляти. Використовуючи це як вихідну точку, чи можете ви побачити будь-яку причину не використовувати а Varien_Objectне інший модельний клас, а потім викликати saveметод, що не амортизується ресурсом ?
Алан Шторм

Відповідаючи на моє власне питання вище, це тому, що метод збереження загального ресурсу має Mage_Core_Model_Abstractнатяк на тип масиву даних.
Алан Шторм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.