Utilizzo dell'ORM di Magento per inserire un campo ID specifico


14

C'è un modo per usare il semplice ORM di Magento ( Mage_Core_Model_Abstracte Mage_Core_Model_Resource_Abstract) per inserire le righe del modello con una chiave primaria specifica?

Ad esempio, se avessi eseguito quanto segue su un sistema Magento vuoto

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

Mi aspetto una nuova voce nella core_websitetabella. Tuttavia, Magento non fa silenziosamente nulla qui.

Scavando nella risorsa, sembra che io stia fallendo di questo nella classe di risorse del database

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

Poiché il modello ha un ID (ovvero sto inserendo un ID specifico) e poiché _useIsObjectNewè hard coded su false, la mia richiesta di salvataggio viene sempre instradata al insertpercorso.

C'è un modo per forzare un inserto con i modelli Magento predefiniti? (senza una riscrittura / sostituzione di classe).

Sì, SQL non elaborato è un'opzione, ma quindi la funzionalità dell'evento viene persa.


Perché stai cercando di assegnare un ID a un campo di incremento automatico? Se questa è una dipendenza a valle, non dovresti semplicemente creare il record e quindi recuperare il PK generato automaticamente?
Ralph Tice,

@RalphTice Sì, probabilmente sarebbe la cosa giusta da fare per l'uso quotidiano.
Alan Storm,

Risposte:


5

Quindi si ( modifica :) Il trucco è usare una Mage_Core_Model_Abstractsottoclasse che non ha il campo id che il modello di risorsa prevede:

$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', [...])è solo l'evento che vedo consumato nel core. Potrebbe essere semplice come seguire

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

In ogni caso, ho bisogno di una doccia.


1
Una volta che sei pulito - non sono sicuro di seguirlo - c'è un controllo ID simile in forsedSave gist.github.com/astorm/5219357 . Ha funzionato per te o era solo una teoria?
Alan Storm,

Modificata la mia risposta per renderla più ovvia.
benmark

... e ha funzionato per me.
benmark

Ah ah, è quello che ottengo digitando il mio codice invece di copiare e incollare. Usando questo come punto di partenza, vedi qualche motivo per non usare una Varien_Objectinvece della diversa classe del modello e quindi chiamare il savemetodo non deprezzato della risorsa ?
Alan Storm,

E rispondendo alla mia domanda sopra, è perché il metodo di salvataggio della risorsa generica ha un Mage_Core_Model_Abstractsuggerimento di tipo per l'array di dati.
Alan Storm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.