sql >> Base de Datos >  >> RDS >> Mysql

Creación de procedimientos MYSQL en migraciones de Laravel 4

Hay dos problemas principales con su código

  1. DELIMITER no es una instrucción sql válida. Es solo un comando de cliente MySql. Así que simplemente no lo uses. Por cierto el error que obtienes te dice exactamente eso.
  2. No puede usar DB::statement para ejecutar CREATE PROCEDURE código porque usa declaración preparada fuente código para Connection . Puede usar PDO exec() DB::connection()->getPdo()->exec() en cambio

Dicho esto, una migración de muestra para tags imaginarias la tabla podría verse así

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