[英]Laravel 5.1 How do you create a MySQL stored procedure with migration
您好,我正在嘗試使用Laravel 5.1遷移創建存儲過程。 到目前為止,我嘗試使用DB :: connection()-> getPdo()-> exec(),DB :: raw()和DB :: unprepared(),但是沒有運氣。 這是我的代碼的樣子:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Wryttnapp\Models\User;
class AddCentroidFieldsToUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
DB::connection()->getPdo()->exec("
ALTER TABLE `users`
ADD COLUMN centroid POINT NULL
AFTER `avatar`;");
DB::unprepared("SET @OLD_SQL_MODE=@@SQL_MODE;
DELIMITER ;;
DROP PROCEDURE IF EXISTS UPDATE_USER_CENTROID;;
CREATE PROCEDURE UPDATE_USER_CENTROID(userId INT)
NOT DETERMINISTIC
BEGIN
DECLARE bDone INT;
DECLARE tempLatLon VARCHAR(100);
DECLARE counter INT;
DECLARE firstLatLon VARCHAR(100);
DECLARE polygonDefinition TEXT;
DECLARE geometry POINT;
DECLARE curs CURSOR FOR SELECT DISTINCT CONCAT(`latitude`, ' ', `longitude`) FROM `user_locations` WHERE `user_id` = userId ORDER BY `id` ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
OPEN curs;
SET bDone = 0;
SET counter = 0;
SET polygonDefinition = ',';
FETCH curs INTO tempLatLon;
WHILE NOT bDone DO
SET polygonDefinition = CONCAT(polygonDefinition, ',', tempLatLon);
IF counter = 0 THEN
SET firstLatLon = tempLatLon;
END IF;
SET counter = counter + 1;
FETCH curs INTO tempLatLon;
END WHILE;
CLOSE curs;
SET polygonDefinition = CONCAT(polygonDefinition, ',', firstLatLon);
SET polygonDefinition = SUBSTRING(polygonDefinition, 3);
SET polygonDefinition = CONCAT('POLYGON((', polygonDefinition, '))');
SET geometry = ST_Centroid(ST_GeomFromText(polygonDefinition));
UPDATE `users` SET centroid = geometry WHERE id = userId;
END;;
DELIMITER ;
");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
DB::connection()->getPdo()->exec("
ALTER TABLE `users` DROP COLUMN centroid;
DROP INDEX centroid_index ON `users`;
DROP FUNCTION IF EXISTS `UPDATE_USER_CENTROID`;");
}
}
請幫忙! 謝謝!
到目前為止,這就是我在遷移過程中一直采用的方式。我相信設置分隔符時遇到了一些麻煩,因此我刪除了分隔符並為每個語句使用了不同的unprepared()
。
$procedure = "
CREATE PROCEDURE `procedure_name`(procedure_param_1 TEXT, procedure_param_2 TEXT)
BEGIN
// Your SP here
END
";
DB::unprepared("DROP procedure IF EXISTS procedure_name");
DB::unprepared($procedure);
這似乎有關: Laravel遷移原始SQL錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.