Laravel, создайте триггер MySQL из миграции

Я создал хранимую процедуру MySQL из миграции, и она отлично работает.

DB::unprepared('
    CREATE PROCEDURE sp_Create_Default_Task_1(IN _kid_id INT)
    BEGIN
        INSERT INTO tasks (kid_id, name) VALUES (_kid_id, \'daily\');
    END'
    );

В дальнейшем я попытался сделать то же самое, чтобы создать триггер MySQL со следующим кодом

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTrigger extends Migration {

    public function up()
    {
        DB::unprepared('
        CREATE TRIGGER tr_Task_Default AFTER INSERT ON `kids` FOR EACH ROW
            INSERT INTO tasks (`kid_id`, `name`) VALUES (NEW.id, \'Default\');
        ');
    }


    public function down()
    {
        DB::unprepared('DROP TRIGGER `tr_User_Default_Member_Role`');
    }
}

Но он возвращает ошибку после запуска php artisan migrate

{"error":{"type":
"Symfony\\Component\\Debug\\Exception\\FatalErrorException",
"message":"Class 'CreateTriggers' not found",
"file":"C:\\xampp\\htdocs\\dev03\\vendor\\laravel\\framework
\\src\\Illuminate\\Database\\Migrations\\Migrator.php",
"line":301}}

Вопрос. Что происходит не так?


person maytham-ɯɐɥʇʎɐɯ    schedule 10.12.2014    source источник
comment
Выложите весь файл. Похоже, ваше имя класса неверно?   -  person Laurence    schedule 11.12.2014
comment
Я решил это сейчас, спасибо, это было что-то с именем класса   -  person maytham-ɯɐɥʇʎɐɯ    schedule 11.12.2014


Ответы (3)


Возникла проблема с именованием классов.

Правильное имя класса может помочь ИЛИ сделать, как я, временно скопируйте свой рабочий код триггера в блокнот/текст. Удалите старый файл триггера миграции и создайте новый.

Примечание. Кстати, одно и то же решение справедливо для Laravel 4.x и Laravel 5.x.

В Ларавеле 4

php artisan generate:migration create_trigger

В Ларавеле 5

php artisan make:migration create_trigger

После того, как он был сгенерирован, я копирую и вставляю тот же код триггера из своего блокнота/текста, и он отлично работает.

Вот окончательный рабочий код для создания триггера посредством миграции.

он работает как с методом RAW, так и с методом UNPREPARED.

<?php

use Illuminate\Database\Migrations\Migration;

class CreateTrigger extends Migration {

    public function up()
    {
        DB::unprepared('
        CREATE TRIGGER tr_User_Default_Member_Role AFTER INSERT ON `users` FOR EACH ROW
            BEGIN
                INSERT INTO role_user (`role_id`, `user_id`, `created_at`, `updated_at`) 
                VALUES (3, NEW.id, now(), null);
            END
        ');
    }

    public function down()
    {
        DB::unprepared('DROP TRIGGER `tr_User_Default_Member_Role`');
    }
}

Примечание. Это всего лишь пример для демонстрации концепции.

person maytham-ɯɐɥʇʎɐɯ    schedule 11.12.2014
comment
Для меня миграция для создания триггера прошла успешно, но я не смог найти триггер в базе данных. не могли бы вы помочь - person Reiah Paul Sam; 13.03.2018

Запустите composer dumpautoload в корне (там же, где и artisan) должно заработать.

person Yarco    schedule 30.09.2016

В Laravel 5.5 работает только с методом DB::unprepared().

person Cristian Ghirba    schedule 24.02.2018