Có phương pháp nào trong Magento cho phép tạo trình kích hoạt MySQL và các thủ tục được lưu trữ không?


8

Tôi đang cố gắng tìm hiểu xem Magento có sẵn một phương thức cho phép tạo các trình kích hoạt MySQL và Thủ tục lưu trữ hay không .

Hiện tại, tôi đang sử dụng bộ điều hợp DB tài nguyên lõi để chèn SQL thô trực tiếp từ tập lệnh thiết lập của mình và tự hỏi liệu trên thực tế có phương pháp nào cho việc này không, tương tự như cách chúng ta thêm khóa ngoại, v.v.

Có ai biết bất cứ điều gì như thế này trong EE hoặc CE không? Một thư viện hoặc kịch bản tùy chỉnh có lẽ?

Câu trả lời:


5

Ok, vì vậy tôi đã không có nhiều phản hồi từ việc này nên bắt đầu tự mình tìm hiểu để có thể trả lời một nửa câu hỏi tôi đã hỏi.

Đã thực hiện một "grep" đơn giản và tình cờ thấy lớp sau được giấu trong thư mục lib: lib/Magento/Db/Sql/Trigger.php

Nó khá đơn giản và đây là những gì tôi đã làm với nó hoạt động (có thể được đặt trong tập lệnh cài đặt / nâng cấp của bạ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();

Tôi đã thêm ý kiến ​​để đưa ra một ý tưởng cơ bản về những gì có thể được sử dụng, tốt nhất hãy tự mình kiểm tra lớp. Phần thân về cơ bản là SQL thô nhưng có thể được biên dịch bằng các phương thức thông thường của Magento. Tôi đã sử dụng SQL thô cho mục đích trình diễn.

Dù vậy, tôi vẫn đang cố gắng tìm cách thực hiện THỦ TỤC LƯU TRỮ mà không thành công. Có ai gặp phải bất cứ điều gì như thế này trong Magento có thể được giấu để sử dụng trong tương lai?


Cách dễ nhất là chỉ sử dụng .sqltệp phiên bản với quy trình được lưu trữ của bạn. Thêm chi tiết: alanstorm.com/magento_setup_resource
B00mer

Ngoài ra và để tránh lỗi, bạn có thể chỉ định tên kích hoạt $trigger->setName('my_trigger_name')và thêm $this->getConnection()->dropTrigger($trigger->getName())ngay trước đó$this->getConnection()->query($triggerCreateQuery);
Kevin Thomas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.