web-dev-qa-db-ja.com

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}}

質問:何が問題なのですか?

クラスの命名に問題がありました。

正しいクラス名が役立つ場合がありますOR私がやったように、メモ帳/テキストに作業トリガーコードを一時的にコピーします。古い移行トリガーファイルを削除して新しいトリガーファイルを生成します。

注:ちなみに、同じソリューションはLaravel 4.xおよびLaravel 5.x

In Laravel 4

php artisan migrate:make create_trigger

In Laravel 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`');
    }
}

注:これは概念を示すための単なる例です

ルート(artisanと同じ場所)でcomposer dumpautoloadを実行すると動作します。

2
Yarco

In Laravel 5.5はDB::unprepared()メソッドでのみ動作します。

1
Cristian Ghirba