Apakah ada metode di Magento yang memungkinkan untuk membuat pemicu MySQL dan prosedur tersimpan?

8

Saya mencoba mencari tahu apakah Magento memiliki metode yang tersedia yang memungkinkan untuk membuat pemicu MySQL dan Prosedur Tersimpan .

Saat ini, saya menggunakan adaptor DB sumber daya inti untuk memasukkan SQL mentah langsung dari skrip pengaturan saya, dan bertanya-tanya apakah sebenarnya ada metode yang tersedia untuk ini, mirip dengan cara kita menambahkan kunci asing, dll.

Adakah yang tahu hal seperti ini baik di EE atau CE? Perpustakaan atau skrip khusus mungkin?

Shaughn
sumber

Jawaban:

5

Ok, jadi saya belum mendapat banyak tanggapan dari ini, jadi mulai menggali sekitar saya mampu menjawab setengah dari pertanyaan yang saya tanyakan.

Melakukan "grep" sederhana dan menemukan kelas berikut yang tersimpan di folder lib: lib/Magento/Db/Sql/Trigger.php

Cukup lurus ke depan dan inilah yang telah saya buat yang berfungsi (dapat ditempatkan di skrip instal / peningkatan):

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

Saya telah menambahkan komentar untuk memberikan ide dasar tentang apa yang dapat digunakan, kalau tidak sebaiknya periksa kelas sendiri. Tubuh pada dasarnya adalah SQL mentah tetapi dapat dikompilasi menggunakan metode konvensional Magento. Saya telah menggunakan SQL mentah untuk tujuan demonstrasi.

Itu keluar dari jalan, saya masih mencoba menemukan cara untuk menerapkan PROSEDUR TERSIMPOR tanpa keberhasilan. Adakah yang menemukan sesuatu seperti ini di Magento yang mungkin tersimpan untuk digunakan di masa depan?

Shaughn
sumber
Rute termudah hanya menggunakan .sqlfile versi dengan prosedur tersimpan Anda. Lebih detail: alanstorm.com/magento_setup_resources
B00MER
Selain itu dan untuk menghindari kesalahan, Anda dapat menentukan nama pemicu dengan $trigger->setName('my_trigger_name')dan menambahkan $this->getConnection()->dropTrigger($trigger->getName())sebelum$this->getConnection()->query($triggerCreateQuery);
Kevin Thomas