Utiliser l'ORM de Magento pour insérer un champ d'identification spécifique


14

Existe-t-il un moyen d'utiliser l'ORM simple de Magento ( Mage_Core_Model_Abstractet Mage_Core_Model_Resource_Abstract) pour insérer des lignes de modèle avec une clé primaire spécifique?

Par exemple, si j'ai exécuté ce qui suit sur un système Magento vide

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

Je m'attendrais à une nouvelle entrée dans le core_websitetableau. Cependant, Magento ne fait rien en silence ici.

En creusant dans la ressource, il semble que je tombe dans la classe de ressources de base de données

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

Parce que le modèle a un identifiant (c'est-à-dire que j'insère un identifiant spécifique), et parce qu'il _useIsObjectNewest codé en dur sur faux, ma demande de sauvegarde est toujours acheminée vers le insertchemin.

Existe-t-il un moyen de forcer une insertion avec les modèles Magento par défaut? (sans réécriture / remplacement de classe).

Oui, le SQL brut est une option, mais la fonctionnalité d'événement est alors perdue.


Pourquoi essayez-vous d'attribuer un ID à un champ d'auto-incrémentation? S'il s'agit d'une dépendance en aval, ne devez-vous pas simplement créer l'enregistrement, puis récupérer le PK généré automatiquement?
Ralph Tice

@RalphTice Oui, ce serait probablement la bonne chose à faire pour une utilisation quotidienne.
Alan Storm

Réponses:


5

Donc voilà. ( modifier :) L'astuce consiste à utiliser une Mage_Core_Model_Abstractsous - classe qui n'a pas le champ id que le modèle de ressource attend:

$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', [...])est le seul événement que je vois être consommé dans le noyau. Cela pourrait être aussi simple que de suivre

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

De toute façon, j'ai besoin d'une douche.


1
Une fois que vous êtes propre - je ne suis pas sûr de le suivre - il y a une vérification d'identité similaire dans forsedSave gist.github.com/astorm/5219357 . Est-ce que cela a fonctionné pour vous ou était-ce juste une théorie?
Alan Storm

Modifié ma réponse pour la rendre plus évidente.
benmarks

... et cela a fonctionné pour moi.
benmarks

Ah ha, c'est ce que j'obtiens en tapant mon propre code au lieu de copier et coller. En utilisant cela comme point de départ, pouvez-vous voir une raison de ne pas utiliser une Varien_Objectau lieu de la classe de modèle différente, puis d'appeler la saveméthode non dépréciée de la ressource ?
Alan Storm

Et répondre à ma propre question ci-dessus, c'est parce que la méthode de sauvegarde de la ressource générique a Mage_Core_Model_Abstractun indice de type pour le tableau de données.
Alan Storm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.