MySQLトリガーとストアドプロシージャを作成できるメソッドがMagentoにありますか?


8

MySQLトリガーとストアドプロシージャを作成できるメソッドがMagentoにあるかどうかを確認しようとしています。

現在、コアリソースDBアダプターを使用して生のSQLをセットアップスクリプトから直接挿入しており、外部キーを追加する方法と同様に、実際にこれに使用できるメソッドがあるかどうか疑問に思っていました。

EEまたはCEのいずれかでこのようなことを知っている人はいますか?ライブラリまたはカスタムスクリプトですか?

回答:


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で、将来使用するために隠されている可能性があるものに遭遇したことがありますか?


最も簡単な.sql方法は、ストアドプロシージャでバージョンファイルを使用することです。詳細:alanstorm.com/magento_setup_resources
B00MER

さらに、エラーを回避するために、トリガー名を指定して直前に$trigger->setName('my_trigger_name')追加できます$this->getConnection()->dropTrigger($trigger->getName())$this->getConnection()->query($triggerCreateQuery);
Kevin Thomas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.