Joh*_*nes 15 mysql stored-procedures database-migration laravel laravel-4
有没有办法在Laravel 4迁移中生成存储的MYSQL程序?
例如,这是一个存储为字符串的简单过程生成查询(通过Heredoc)
$query = <<<SQL
DELIMITER $$
DROP PROCEDURE IF EXISTS test$$
CREATE PROCEDURE test()
BEGIN
INSERT INTO `test_table`(`name`) VALUES('test');
END$$
DELIMITER ;
SQL;
DB:statement(DB::RAW($query));
Run Code Online (Sandbox Code Playgroud)
在迁移up()
功能中运行此命令时出现此错误:
pet*_*erm 29
您的代码有两个主要问题
DELIMITER
不是有效的sql语句.它只是一个MySql客户端命令.所以就是不要使用它.顺便说一句,你得到的错误就是这么说的.DB::statement
执行CREATE PROCEDURE
代码,因为它使用预准备语句源代码Connection
.您可以使用PDO 来代替exec()
DB::connection()->getPdo()->exec()
也就是说,假想tags
表的示例迁移可能如下所示
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');
}
}
Run Code Online (Sandbox Code Playgroud)
Vai*_*y07 13
对于寻找@Johannes提到的laravel链接的同伴开发.
有什么方法可以在迁移中创建MYSQL程序?由@aheissenberger回答.
我用它,它对我很有用:
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');
}
Run Code Online (Sandbox Code Playgroud)
要在代码中调用过程:
DB::unprepared('CALL get_highscore()');
Run Code Online (Sandbox Code Playgroud)
如果你期望得到一个表:
DB::statement('CALL update_highscore()');
Run Code Online (Sandbox Code Playgroud)
如果你期望变量:
DB::statement('CALL update_ranking(3,10,@olduser,@newuser)');
$dberg = DB::select('select @olduser as old, @newuser as new');
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8148 次 |
最近记录: |