Creating MYSQL Procedure in Laravel 4 Migrations

后端 未结 2 1899
悲哀的现实
悲哀的现实 2020-12-03 11:01

Is there a way to generate stored MYSQL procedures in a Laravel 4 migration?

For example, here\'s a simple procedure generation query stored as a string (via a Hered

相关标签:
2条回答
  • 2020-12-03 11:45

    There are two major problems with your code

    1. DELIMITER is not a valid sql statement. It's just a MySql client command. So just don't use it. BTW the error you get tells you exactly that.
    2. You can't use DB::statement to execute CREATE PROCEDURE code because it uses prepared statement source code for Connection. You can use PDO exec() DB::connection()->getPdo()->exec() instead

    That being said a sample migration for imaginary tags table might look like this

    class CreateTagsTable extends Migration {
    
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('tags', function($table){
                $table->increments('id');
                $table->string('name')->unique();
            });
    $sql = <<<SQL
    DROP PROCEDURE IF EXISTS sp_insert_tag;
    CREATE PROCEDURE sp_insert_tag(IN _name VARCHAR(32))
    BEGIN
        INSERT INTO `tags`(`name`) VALUES(_name);
    END
    SQL;
            DB::connection()->getPdo()->exec($sql);
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            $sql = "DROP PROCEDURE IF EXISTS sp_insert_tag";
            DB::connection()->getPdo()->exec($sql);
            Schema::drop('tags');
        }
    }
    
    0 讨论(0)
  • 2020-12-03 11:49

    For fellow dev looking for the link in laravel mentioned by @Johannes.

    Any way to create MYSQL Procedures in Migrations? answered by @aheissenberger.

    I use this and it works well for me:

    public function up() {            
        DB::unprepared('CREATE PROCEDURE get_highscore() BEGIN SET time_zone = \'Europe/Berlin\'; SET @refscore :=0; SELECT * FROM test; END');
    }
    
    public function down() {
        DB::unprepared('DROP PROCEDURE IF EXISTS get_highscore');
    }
    

    To call a procedure in your code:

    DB::unprepared('CALL get_highscore()');
    

    if you expect a resulting table:

    DB::statement('CALL update_highscore()');
    

    if you expect variables:

    DB::statement('CALL update_ranking(3,10,@olduser,@newuser)');
    $dberg = DB::select('select @olduser as old, @newuser as new');
    
    0 讨论(0)
提交回复
热议问题