Existe um método no Magento que permite criar gatilhos do MySQL e procedimentos armazenados?

8

Eu estou tentando descobrir se o Magento tem um método disponível que permite criar gatilhos do MySQL e procedimentos armazenados .

Atualmente, estou usando o adaptador de banco de dados do recurso principal para inserir o SQL bruto diretamente do meu script de instalação e fiquei imaginando se havia realmente um método disponível para isso, semelhante à maneira como adicionamos chaves estrangeiras, etc.

Alguém sabe de algo assim no EE ou CE? Uma biblioteca ou script personalizado, talvez?

Shaughn
fonte

Respostas:

5

Ok, então eu não tive muita resposta disso, então comecei a cavar em torno de mim e sou capaz de responder metade da pergunta que fiz.

Fiz um simples "grep" e me deparei com a seguinte classe escondida na pasta lib: lib/Magento/Db/Sql/Trigger.php

É bem simples e aqui está o que eu criei que funciona (pode ser colocado no seu script de instalação / atualização):

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

Eu adicionei comentários para dar uma idéia básica do que pode ser usado; caso contrário, é melhor ir conferir a aula. O corpo é basicamente SQL bruto, mas pode ser compilado usando os métodos convencionais do Magento. Eu usei o SQL bruto para fins de demonstração.

Que fora do caminho, ainda estou tentando encontrar uma maneira de implementar PROCEDIMENTOS ARMAZENADOS sem sucesso. Alguém já encontrou algo assim no Magento que pode ser escondido para uso futuro?

Shaughn
fonte
A rota mais fácil é apenas usar um .sqlarquivo de versão com o procedimento armazenado. Mais detalhes: alanstorm.com/magento_setup_resources
B00MER
Além disso, e para evitar erros, você pode especificar um nome de gatilho $trigger->setName('my_trigger_name')e adicionar um $this->getConnection()->dropTrigger($trigger->getName())pouco antes$this->getConnection()->query($triggerCreateQuery);
Kevin Thomas