Есть ли в Magento метод, позволяющий создавать триггеры MySQL и хранимые процедуры?

8

Я пытаюсь выяснить, есть ли в Magento метод, позволяющий создавать триггеры MySQL и хранимые процедуры .

В настоящее время я использую адаптер базы данных основного ресурса для вставки необработанного SQL непосредственно из сценария установки, и мне было интересно, существует ли на самом деле метод для этого, аналогичный тому, как мы добавляем внешние ключи и т. Д.

Кто-нибудь знает что-нибудь подобное в EE или CE? Библиотека или пользовательский скрипт, возможно?

Shaughn
источник

Ответы:

5

Хорошо, так что я не получил много ответа от этого, поэтому начал копаться вокруг себя, я могу ответить на половину вопроса, который я задал.

Сделал простой "grep" и наткнулся на следующий класс, спрятанный в папке lib: lib/Magento/Db/Sql/Trigger.php

Это довольно просто, и вот то, что я придумал, это работает (может быть помещено в ваш скрипт установки / обновления):

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

Я добавил комментарии, чтобы дать общее представление о том, что можно использовать, иначе лучше самим проверить класс. Тело в основном является сырым SQL, но может быть скомпилировано с использованием традиционных методов Magento. Я использовал сырой SQL для демонстрационных целей.

Это вне пути, я все еще пытаюсь найти способ реализовать ХРАНЕННЫЕ ПРОЦЕДУРЫ без успеха. Кто-нибудь сталкивался с чем-то подобным в Magento, которое можно спрятать для будущего использования?

Shaughn
источник
Самый простой способ - просто использовать .sqlфайл версии с вашей хранимой процедурой. Более подробная информация: alanstorm.com/magento_setup_resources
B00MER
Кроме того, чтобы избежать ошибок, вы можете указать имя триггера с помощью $trigger->setName('my_trigger_name')и добавить $this->getConnection()->dropTrigger($trigger->getName())непосредственно перед этим$this->getConnection()->query($triggerCreateQuery);
Кевин Томас