Existe-t-il une méthode dans Magento qui permet de créer des déclencheurs MySQL et des procédures stockées?


8

J'essaie de savoir si Magento a une méthode disponible qui permet de créer des déclencheurs MySQL et des procédures stockées .

Actuellement, j'utilise l'adaptateur de base de données DB pour insérer le SQL brut directement à partir de mon script de configuration, et je me demandais s'il y avait en fait une méthode disponible pour cela, similaire à la façon dont nous ajoutons des clés étrangères, etc.

Quelqu'un sait-il quelque chose comme ça en EE ou en CE? Une bibliothèque ou un script personnalisé peut-être?

Réponses:


5

Ok, donc je n'ai pas eu beaucoup de réponse à cela, alors j'ai commencé à creuser autour de moi et je suis en mesure de répondre à la moitié de la question que j'ai posée.

A fait un simple "grep" et est tombé sur la classe suivante cachée dans le dossier lib: lib/Magento/Db/Sql/Trigger.php

C'est assez simple et voici ce que j'ai trouvé qui fonctionne (peut être placé dans votre script d'installation / mise à niveau):

<?php
/** @var $installer Mage_Core_Model_Resource_Setup */
$installer = $this;
$installer->startSetup();

// Trigger
$trigger = new Magento_Db_Sql_Trigger();

// Set time SQL_TIME_BEFORE / SQL_TIME_AFTER
$trigger->setTime($trigger::SQL_TIME_BEFORE);

// Set time SQL_EVENT_INSERT / SQL_EVENT_UPDATE / SQL_EVENT_DELETE
$trigger->setEvent($trigger::SQL_EVENT_INSERT);

// Set target table name
$trigger->setTarget($installer->getTable('fontera_trader/leaderboards_global_tmp'));

// Set Body
$trigger->setBody(
'INSERT INTO '.$installer->getTable('fontera_trader/leaderboards_global').'
    (entity_id, customer_id , credit_value, prize_value, games_played, rank, prev_rank)
    VALUES
    (NEW.entity_id, NEW.customer_id, NEW.credit_value, NEW.prize_value, NEW.games_played, NEW.rank, NEW.prev_rank)
    ON DUPLICATE KEY UPDATE
    customer_id = NEW.customer_id,
    credit_value = NEW.credit_value,
    prize_value = NEW.prize_value,
    games_played = NEW.games_played,
    rank = NEW.rank,
    prev_rank = NEW.prev_rank;

    SET @r = 0;

    UPDATE '.$installer->getTable('fontera_trader/leaderboards_global').'
    SET
    prev_rank = rank,
    rank = @r:= (@r+1)
    ORDER BY
    credit_value
    DESC;
'
);

// Assemble query, returns direct SQL for trigger
$triggerCreateQuery = $trigger->assemble();

// Adapter initiates query
$this->getConnection()->query($triggerCreateQuery);

$installer->endSetup();

J'ai ajouté des commentaires pour donner une idée de base de ce qui peut être utilisé, sinon mieux vaut vérifier la classe par vous-même. Le corps est essentiellement du SQL brut mais peut être compilé en utilisant les méthodes conventionnelles de Magento. J'ai utilisé du SQL brut à des fins de démonstration.

Cela à l'écart, j'essaie toujours de trouver un moyen de mettre en œuvre les procédures stockées sans succès. Quelqu'un a-t-il rencontré quelque chose comme ça dans Magento qui pourrait être caché pour une utilisation future?


L'itinéraire le plus simple consiste simplement à utiliser un .sqlfichier de version avec votre procédure stockée. Plus de détails: alanstorm.com/magento_setup_resources
B00MER

De plus, et pour éviter les erreurs, vous pouvez spécifier un nom de déclencheur avec $trigger->setName('my_trigger_name')et ajouter $this->getConnection()->dropTrigger($trigger->getName())juste avant$this->getConnection()->query($triggerCreateQuery);
Kevin Thomas
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.