Esiste un metodo in Magento che consente di creare trigger MySQL e procedure memorizzate?


8

Sto cercando di scoprire se Magento ha un metodo disponibile che consente di creare trigger MySQL e Stored procedure .

Attualmente sto usando l'adattatore DB di risorse di base per inserire l'SQL non elaborato direttamente dal mio script di installazione e mi chiedevo se fosse effettivamente disponibile un metodo per questo, simile al modo in cui aggiungiamo chiavi esterne, ecc.

Qualcuno sa qualcosa di simile o in EE o CE? Una libreria o uno script personalizzato forse?

Risposte:


5

Ok, quindi non ho avuto molte risposte da questo, quindi ho iniziato a scavare intorno a me stesso, sono in grado di rispondere a metà della domanda che ho posto.

Ha fatto un semplice "grep" e ho trovato la seguente classe nascosta nella cartella lib: lib/Magento/Db/Sql/Trigger.php

È piuttosto semplice ed ecco cosa ho escogitato che funziona (può essere inserito nello script di installazione / aggiornamento):

<?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();

Ho aggiunto commenti per dare un'idea di base di ciò che può essere utilizzato, altrimenti è meglio controllare la classe da soli. Il corpo è fondamentalmente SQL grezzo ma può essere compilato utilizzando i metodi convenzionali di Magento. Ho usato SQL grezzo a scopo dimostrativo.

A parte questo, sto ancora cercando di trovare un modo per attuare PROCEDURE MEMORIZZATE senza successo. Qualcuno ha trovato qualcosa del genere in Magento che potrebbe essere nascosto per un uso futuro?


Il percorso più semplice è utilizzare un .sqlfile di versione con la procedura memorizzata. Maggiori dettagli: alanstorm.com/magento_setup_resources
B00MER

Inoltre, per evitare errori, è possibile specificare un nome di trigger con $trigger->setName('my_trigger_name')e aggiungere $this->getConnection()->dropTrigger($trigger->getName())poco prima$this->getConnection()->query($triggerCreateQuery);
Kevin Thomas il
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.