¿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?

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?


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.