¿Hay algún método en Magento que permita crear disparadores MySQL y procedimientos almacenados?

8

Estoy tratando de averiguar si Magento tiene un método disponible que permita crear disparadores MySQL y procedimientos almacenados .

Actualmente, estoy usando el adaptador de base de datos de recursos centrales para insertar el SQL sin procesar directamente desde mi script de configuración, y me preguntaba si de hecho había un método disponible para esto, similar a la forma en que agregamos claves externas, etc.

¿Alguien sabe de algo como esto en EE o CE? ¿Una biblioteca o script personalizado quizás?

Shaughn
fuente

Respuestas:

5

Ok, entonces no he recibido mucha respuesta de esto, así que comencé a cavar a mi alrededor y puedo responder la mitad de la pregunta que hice.

Hice un simple "grep" y encontré la siguiente clase escondida en la carpeta lib: lib/Magento/Db/Sql/Trigger.php

Es bastante sencillo y esto es lo que se me ocurrió que funciona (se puede colocar en su script de instalación / actualización):

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

He agregado comentarios para dar una idea básica de lo que se puede usar, de lo contrario, mejor ve a ver la clase tú mismo. El cuerpo es básicamente SQL sin formato, pero puede compilarse utilizando los métodos convencionales de Magento. He usado SQL sin formato para fines de demostración.

Fuera del camino, todavía estoy tratando de encontrar una manera de implementar PROCEDIMIENTOS ALMACENADOS sin éxito. ¿Alguien ha encontrado algo como esto en Magento que pueda estar escondido para su uso futuro?

Shaughn
fuente
La ruta más fácil es usar un .sqlarchivo de versión con su procedimiento almacenado. Más detalles: alanstorm.com/magento_setup_resources
B00MER
Además y para evitar errores, puede especificar un nombre de disparador con $trigger->setName('my_trigger_name')y agregar $this->getConnection()->dropTrigger($trigger->getName())justo antes$this->getConnection()->query($triggerCreateQuery);
Kevin Thomas