{"id":2652,"date":"2025-03-24T08:46:51","date_gmt":"2025-03-23T23:46:51","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2652"},"modified":"2025-03-24T08:47:20","modified_gmt":"2025-03-23T23:47:20","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel-migration-rollback%e3%81%ae%e5%85%a8%e6%89%8b%e9%a0%86%e3%81%a85%e3%81%a4%e3%81%ae%e5%a4%b1%e6%95%97%e3%81%97%e3%81%aa%e3%81%84%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2652","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel Migration Rollback\u306e\u5168\u624b\u9806\u30685\u3064\u306e\u5931\u6557\u3057\u306a\u3044\u65b9\u6cd5"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Laravel Migration Rollback\u3068\u306f\u4f55\u304b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u5909\u66f4\u3092\u5b89\u5168\u306b\u5143\u306b\u623b\u305b\u308b\u6a5f\u80fd<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">rollback\u304c\u5fc5\u8981\u306b\u306a\u308b\u30b7\u30c1\u30e5\u30a8\u30fc\u30b7\u30e7\u30f3<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">Migration Rollback\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">rollback\u30b3\u30de\u30f3\u30c9\u306e\u57fa\u672c\u69cb\u6587\u3068\u52d5\u4f5c\u539f\u7406<\/a>      <\/li>      <li>        <a href=\"#i-5\">\u30b9\u30c6\u30c3\u30d7\u6570\u3092\u6307\u5b9a\u3057\u305frollback\u306e\u5b9f\u884c\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-6\">\u7279\u5b9a\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u307e\u3067\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3059\u308b\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-7\">\u5931\u6557\u3057\u306a\u3044Migration Rollback\u306e5\u3064\u306e\u30dd\u30a4\u30f3\u30c8<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-8\">\u5b9f\u884c\u524d\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li>        <a href=\"#i-9\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u9806\u5e8f\u306e\u78ba\u8a8d\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u5916\u90e8\u30ad\u30fc\u5236\u7d04\u306e\u9069\u5207\u306a\u51e6\u7406<\/a>      <\/li>      <li>        <a href=\"#i-11\">\u30b7\u30fc\u30c0\u30fc\u3068\u306e\u9023\u643a\u306b\u3088\u308b\u5b89\u5168\u306a\u5b9f\u884c<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-12\">\u672c\u756a\u74b0\u5883\u3067\u306e\u5b9f\u884c\u6642\u306e\u6ce8\u610f\u70b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-13\">\u3088\u304f\u3042\u308bRollback\u306e\u30c8\u30e9\u30d6\u30eb\u3068\u89e3\u6c7a\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-14\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u304c\u9014\u4e2d\u3067\u6b62\u307e\u308b\u5834\u5408\u306e\u5bfe\u51e6\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-15\">\u5916\u90e8\u30ad\u30fc\u5236\u7d04\u306b\u3088\u308b\u30a8\u30e9\u30fc\u306e\u89e3\u6c7a\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-16\">migration\u30c6\u30fc\u30d6\u30eb\u306e\u4e0d\u6574\u5408\u306e\u4fee\u6b63\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-17\">\u52b9\u7387\u7684\u306aMigration\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-18\">\u30c6\u30b9\u30c8\u74b0\u5883\u3067\u306e\u4e8b\u524d\u78ba\u8a8d\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li>        <a href=\"#i-19\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308brollback\u904b\u7528\u30eb\u30fc\u30eb<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-20\">\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Laravel Migration Rollback\u3068\u306f\u4f55\u304b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u5909\u66f4\u3092\u5b89\u5168\u306b\u5143\u306b\u623b\u305b\u308b\u6a5f\u80fd<\/h3>\n\n\n\n<p>Laravel Migration Rollback\u306f\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b9\u30ad\u30fc\u30de\u306e\u5909\u66f4\u3092\u5b89\u5168\u306b\u5143\u306e\u72b6\u614b\u306b\u623b\u3059\u3053\u3068\u304c\u3067\u304d\u308b\u6a5f\u80fd\u3067\u3059\u3002\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u3068\u3057\u3066\u6a5f\u80fd\u3059\u308bLaravel Migration\u306e\u91cd\u8981\u306a\u4e00\u90e8\u3068\u3057\u3066\u4f4d\u7f6e\u3065\u3051\u3089\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u306b\u306f\u3001\u5fc5\u305a<code>up()<\/code>\u30e1\u30bd\u30c3\u30c9\u3068<code>down()<\/code>\u30e1\u30bd\u30c3\u30c9\u306e2\u3064\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class CreateUsersTable extends Migration\n{\n    public function up()\n    {\n        Schema::create('users', function (Blueprint $table) {\n            $table-&gt;id();\n            $table-&gt;string('name');\n            $table-&gt;string('email')-&gt;unique();\n            $table-&gt;timestamp('email_verified_at')-&gt;nullable();\n            $table-&gt;string('password');\n            $table-&gt;rememberToken();\n            $table-&gt;timestamps();\n        });\n    }\n\n    public function down()\n    {\n        Schema::dropIfExists('users');\n    }\n}<\/pre>\n\n\n\n<p>Rollback\u6a5f\u80fd\u306e\u4e3b\u306a\u7279\u5fb4\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u53ef\u9006\u6027\u306e\u4fdd\u8a3c<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>up()<\/code>\u30e1\u30bd\u30c3\u30c9\u306b\u3088\u308b\u5909\u66f4\u3092<code>down()<\/code>\u30e1\u30bd\u30c3\u30c9\u3067\u5b8c\u5168\u306b\u5143\u306b\u623b\u305b\u308b<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u69cb\u9020\u306e\u6574\u5408\u6027\u3092\u7dad\u6301<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9f\u884c\u3057\u305f\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u30d0\u30c3\u30c1\u5358\u4f4d\u3067\u7ba1\u7406<\/li>\n\n\n\n<li>\u8907\u6570\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u9069\u5207\u306a\u9806\u5e8f\u3067\u623b\u3059\u3053\u3068\u304c\u53ef\u80fd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5b9f\u884c\u5c65\u6b74\u306e\u8ffd\u8de1<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>migrations\u30c6\u30fc\u30d6\u30eb\u3067\u5168\u3066\u306e\u5b9f\u884c\u5c65\u6b74\u3092\u7ba1\u7406<\/li>\n\n\n\n<li>\u3069\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u304c\u3044\u3064\u5b9f\u884c\u3055\u308c\u305f\u304b\u3092\u628a\u63e1\u53ef\u80fd<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">rollback\u304c\u5fc5\u8981\u306b\u306a\u308b\u30b7\u30c1\u30e5\u30a8\u30fc\u30b7\u30e7\u30f3<\/h3>\n\n\n\n<p>\u5b9f\u969b\u306e\u958b\u767a\u73fe\u5834\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30b1\u30fc\u30b9\u3067rollback\u304c\u5fc5\u8981\u3068\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u958b\u767a\u30d5\u30a7\u30fc\u30ba\u3067\u306e\u30b9\u30ad\u30fc\u30de\u4fee\u6b63<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c6\u30fc\u30d6\u30eb\u8a2d\u8a08\u306e\u898b\u76f4\u3057\u304c\u5fc5\u8981\u306b\u306a\u3063\u305f\u5834\u5408<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u4fee\u6b63\u524d\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\n   Schema::create('products', function (Blueprint $table) {\n       $table-&gt;id();\n       $table-&gt;string('name');\n       $table-&gt;integer('price');\n       $table-&gt;timestamps();\n   });\n\n   \/\/ \u8a2d\u8a08\u5909\u66f4\u306b\u3088\u308a\u4fa1\u683c\u3092\u5c0f\u6570\u70b9\u5bfe\u5fdc\u306b\u3059\u308b\u5fc5\u8981\u304c\u767a\u751f\n   \/\/ rollback\u3057\u3066\u518d\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\n   Schema::create('products', function (Blueprint $table) {\n       $table-&gt;id();\n       $table-&gt;string('name');\n       $table-&gt;decimal('price', 10, 2);  \/\/ \u5909\u66f4\u70b9\n       $table-&gt;timestamps();\n   });<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u6642\u306e\u554f\u984c\u5bfe\u5fdc<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\u5834\u5408<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u4e0a\u306e\u554f\u984c\u304c\u5224\u660e\u3057\u305f\u5834\u5408<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   # \u30c7\u30d7\u30ed\u30a4\u6642\u306e\u554f\u984c\u767a\u751f\u6642\n   php artisan migrate:rollback  # \u76f4\u524d\u306e\u5909\u66f4\u3092\u53d6\u308a\u6d88\u3057\n\n   # \u554f\u984c\u3092\u4fee\u6b63\u5f8c\u3001\u518d\u5ea6\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c\n   php artisan migrate<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30c6\u30b9\u30c8\u74b0\u5883\u306e\u30ea\u30bb\u30c3\u30c8<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b0\u6a5f\u80fd\u306e\u30c6\u30b9\u30c8\u524d\u306b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30af\u30ea\u30fc\u30f3\u306a\u72b6\u614b\u306b\u623b\u3059\u5834\u5408<\/li>\n\n\n\n<li>\u7570\u306a\u308b\u30c7\u30fc\u30bf\u30bb\u30c3\u30c8\u3067\u30c6\u30b9\u30c8\u3092\u5b9f\u884c\u3059\u308b\u5834\u5408<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   # \u30c6\u30b9\u30c8\u74b0\u5883\u306e\u30ea\u30bb\u30c3\u30c8\n   php artisan migrate:reset    # \u5168\u3066\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u53d6\u308a\u6d88\u3057\n   php artisan migrate         # \u6700\u65b0\u72b6\u614b\u306b\u518d\u69cb\u7bc9\n   php artisan db:seed        # \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306e\u518d\u6295\u5165<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>\u672c\u756a\u74b0\u5883\u3067\u306e\u7dca\u6025\u5bfe\u5fdc<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u69cb\u9020\u306e\u5909\u66f4\u304c\u4e88\u671f\u305b\u306c\u554f\u984c\u3092\u5f15\u304d\u8d77\u3053\u3057\u305f\u5834\u5408<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u306b\u5f71\u97ff\u304c\u51fa\u305f\u5834\u5408<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   # \u672c\u756a\u74b0\u5883\u3067\u306e\u7dca\u6025\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\n   php artisan down                     # \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30e2\u30fc\u30c9\u3078\u5207\u308a\u66ff\u3048\n   php artisan migrate:rollback --step=1 # \u76f4\u524d\u306e\u5909\u66f4\u306e\u307f\u3092\u53d6\u308a\u6d88\u3057\n   php artisan up                      # \u901a\u5e38\u30e2\u30fc\u30c9\u306b\u5fa9\u5e30<\/pre>\n\n\n\n<p>rollback\u304c\u5fc5\u8981\u3068\u306a\u308b\u3053\u308c\u3089\u306e\u30b7\u30c1\u30e5\u30a8\u30fc\u30b7\u30e7\u30f3\u306b\u9069\u5207\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u6e96\u5099\u304c\u91cd\u8981\u3067\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u306e<code>down()<\/code>\u30e1\u30bd\u30c3\u30c9\u3092\u78ba\u5b9f\u306b\u5b9f\u88c5<\/li>\n\n\n\n<li>\u5b9f\u884c\u524d\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d0\u30c3\u30af\u30a2\u30c3\u30d7<\/li>\n\n\n\n<li>\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u624b\u9806\u306e\u4e8b\u524d\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30c1\u30fc\u30e0\u5185\u3067\u306e\u5909\u66f4\u7ba1\u7406\u30eb\u30fc\u30eb\u306e\u78ba\u7acb<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6e96\u5099\u306b\u3088\u308a\u3001\u5fc5\u8981\u306a\u6642\u306b\u5b89\u5168\u304b\u3064\u78ba\u5b9f\u306b\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3092\u5b9f\u884c\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">Migration Rollback\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">rollback\u30b3\u30de\u30f3\u30c9\u306e\u57fa\u672c\u69cb\u6587\u3068\u52d5\u4f5c\u539f\u7406<\/h3>\n\n\n\n<p>Laravel Migration Rollback\u306e\u57fa\u672c\u30b3\u30de\u30f3\u30c9\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u69cb\u6587\u3067\u5b9f\u884c\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u6700\u5f8c\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d0\u30c3\u30c1\u3092\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\nphp artisan migrate:rollback\n\n# \u5168\u3066\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\nphp artisan migrate:reset\n\n# \u5168\u3066\u3092\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3057\u3066\u518d\u5ea6\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u5b9f\u884c\nphp artisan migrate:refresh<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30b3\u30de\u30f3\u30c9\u306e\u52d5\u4f5c\u539f\u7406\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>migrate:rollback<\/code>\u306e\u51e6\u7406\u30d5\u30ed\u30fc<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>migrations\u30c6\u30fc\u30d6\u30eb\u304b\u3089\u6700\u65b0\u306e\u30d0\u30c3\u30c1\u756a\u53f7\u3092\u53d6\u5f97<\/li>\n\n\n\n<li>\u8a72\u5f53\u30d0\u30c3\u30c1\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u3092\u7279\u5b9a<\/li>\n\n\n\n<li>\u5404\u30d5\u30a1\u30a4\u30eb\u306e<code>down()<\/code>\u30e1\u30bd\u30c3\u30c9\u3092\u9006\u9806\u306b\u5b9f\u884c<\/li>\n\n\n\n<li>migrations\u30c6\u30fc\u30d6\u30eb\u304b\u3089\u5b9f\u884c\u6e08\u307f\u30ec\u30b3\u30fc\u30c9\u3092\u524a\u9664<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u5185\u3067\u306e\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u5236\u5fa1\npublic function down()\n{\n    DB::transaction(function () {\n        Schema::table('users', function (Blueprint $table) {\n            $table-&gt;dropColumn('new_column');\n        });\n\n        \/\/ \u95a2\u9023\u30c6\u30fc\u30d6\u30eb\u306e\u66f4\u65b0\n        Schema::table('user_profiles', function (Blueprint $table) {\n            $table-&gt;dropColumn('related_column');\n        });\n    });\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u30b9\u30c6\u30c3\u30d7\u6570\u3092\u6307\u5b9a\u3057\u305frollback\u306e\u5b9f\u884c\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u7279\u5b9a\u306e\u30b9\u30c6\u30c3\u30d7\u6570\u3060\u3051\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3092\u5b9f\u884c\u3059\u308b\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b<code>--step<\/code>\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u7528\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u76f4\u8fd13\u3064\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\nphp artisan migrate:rollback --step=3\n\n# \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u524d\u306b\u5b9f\u884c\u3055\u308c\u308bSQL\u3092\u78ba\u8a8d\nphp artisan migrate:rollback --step=3 --pretend<\/pre>\n\n\n\n<p>\u30b9\u30c6\u30c3\u30d7\u6570\u6307\u5b9a\u306e\u6d3b\u7528\u4f8b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6bb5\u968e\u7684\u306a\u30ed\u30fc\u30eb\u30d0\u30c3\u30af<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u307e\u305a1\u3064\u76ee\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\nphp artisan migrate:rollback --step=1\n\n# \u554f\u984c\u304c\u306a\u3051\u308c\u3070\u8ffd\u52a0\u3067\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\nphp artisan migrate:rollback --step=2<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u8907\u6570\u74b0\u5883\u3067\u306e\u4e00\u8cab\u3057\u305f\u5b9f\u884c<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ deployment.php\nreturn [\n    'rollback_steps' =&gt; env('ROLLBACK_STEPS', 1),\n];\n\n\/\/ \u5b9f\u884c\u6642\nphp artisan migrate:rollback --step=config('deployment.rollback_steps')<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u7279\u5b9a\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u307e\u3067\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3059\u308b\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u7279\u5b9a\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u307e\u3067\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3059\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u65b9\u6cd5\u304c\u3042\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u756a\u53f7\u306b\u3088\u308b\u6307\u5b9a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u7279\u5b9a\u306e\u30d0\u30c3\u30c1\u307e\u3067\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\nphp artisan migrate:rollback --batch=3\n\n# \u30d0\u30c3\u30c1\u60c5\u5831\u306e\u78ba\u8a8d\nphp artisan migrate:status<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30d1\u30b9\u306b\u3088\u308b\u6307\u5b9a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u7279\u5b9a\u306e\u30d1\u30b9\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3092\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\nphp artisan migrate:rollback --path=\/database\/migrations\/2024_02_07_000000_create_users_table.php\n\n# \u8907\u6570\u30d1\u30b9\u306e\u6307\u5b9a\nphp artisan migrate:rollback --path=\/database\/migrations\/users --path=\/database\/migrations\/products<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u74b0\u5883\u5225\u306e\u5b9f\u884c\u5236\u5fa1<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30b9\u30af\u30ea\u30d7\u30c8\u3067\u306e\u6d3b\u7528\u4f8b\nif (App::environment('production')) {\n    \/\/ \u672c\u756a\u74b0\u5883\u3067\u306e\u614e\u91cd\u306a\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\n    Artisan::call('migrate:rollback', [\n        '--step' =&gt; 1,\n        '--force' =&gt; true\n    ]);\n} else {\n    \/\/ \u958b\u767a\u74b0\u5883\u3067\u306e\u67d4\u8edf\u306a\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\n    Artisan::call('migrate:reset');\n}<\/pre>\n\n\n\n<p>\u5b9f\u884c\u6642\u306e\u91cd\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u5b9f\u884c\u524d\u306e\u78ba\u8a8d\u30d7\u30ed\u30f3\u30d7\u30c8\u3092\u30b9\u30ad\u30c3\u30d7\n--force\n\n# \u8a73\u7d30\u306a\u30ed\u30b0\u3092\u51fa\u529b\n--verbose\n\n# \u5b9f\u884c\u3055\u308c\u308bSQL\u3092\u8868\u793a\n--pretend\n\n# \u7279\u5b9a\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u3092\u4f7f\u7528\n--database=mysql2<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30b3\u30de\u30f3\u30c9\u3068\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u69d8\u3005\u306a\u30b7\u30c1\u30e5\u30a8\u30fc\u30b7\u30e7\u30f3\u306b\u5bfe\u5fdc\u3057\u305f\u67d4\u8edf\u306a\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u672c\u756a\u74b0\u5883\u3067\u306e\u5b9f\u884c\u6642\u306f\u7279\u306b\u614e\u91cd\u306a\u5bfe\u5fdc\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-7\">\u5931\u6557\u3057\u306a\u3044Migration Rollback\u306e5\u3064\u306e\u30dd\u30a4\u30f3\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u5b9f\u884c\u524d\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306f\u3001\u5b89\u5168\u306a\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u5b9f\u884c\u306e\u7b2c\u4e00\u6b69\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u65b9\u6cd5\u3067\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30de\u30f3\u30c9\u306e\u4f5c\u6210<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Console\/Commands\/DatabaseBackup.php\nnamespace App\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\n\nclass DatabaseBackup extends Command\n{\n    protected $signature = 'db:backup';\n    protected $description = '\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u4f5c\u6210';\n\n    public function handle()\n    {\n        $filename = 'backup-' . date('Y-m-d-H-i-s') . '.sql';\n        $command = sprintf(\n            'mysqldump -u%s -p%s %s &gt; %s',\n            config('database.connections.mysql.username'),\n            config('database.connections.mysql.password'),\n            config('database.connections.mysql.database'),\n            storage_path('app\/backup\/' . $filename)\n        );\n\n        exec($command);\n        $this-&gt;info('\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f: ' . $filename);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u81ea\u52d5\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u306e\u8a2d\u5b9a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Console\/Kernel.php\nprotected function schedule(Schedule $schedule)\n{\n    $schedule-&gt;command('db:backup')\n            -&gt;beforeAnyMigration()\n            -&gt;beforeAnyRollback();\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u9806\u5e8f\u306e\u78ba\u8a8d\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u306e\u5b9f\u884c\u9806\u5e8f\u3092\u78ba\u8a8d\u3057\u3001\u5b89\u5168\u306b\u5b9f\u884c\u3059\u308b\u305f\u3081\u306e\u30dd\u30a4\u30f3\u30c8\u3067\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5c65\u6b74\u306e\u78ba\u8a8d<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u5b9f\u884c\u5c65\u6b74\u306e\u78ba\u8a8d\nphp artisan migrate:status\n\n# \u5b9f\u884c\u4e88\u5b9a\u306eSQL\u306e\u78ba\u8a8d\nphp artisan migrate:rollback --pretend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u4f9d\u5b58\u95a2\u4fc2\u306e\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class CreateOrderItemsTable extends Migration\n{\n    public function down()\n    {\n        \/\/ \u4f9d\u5b58\u95a2\u4fc2\u3092\u8003\u616e\u3057\u305f\u9806\u5e8f\u3067\u5b9f\u884c\n        Schema::table('order_items', function (Blueprint $table) {\n            $table-&gt;dropForeign(['order_id']);\n        });\n        Schema::dropIfExists('order_items');\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u5916\u90e8\u30ad\u30fc\u5236\u7d04\u306e\u9069\u5207\u306a\u51e6\u7406<\/h3>\n\n\n\n<p>\u5916\u90e8\u30ad\u30fc\u5236\u7d04\u306b\u95a2\u3059\u308b\u554f\u984c\u3092\u9632\u3050\u305f\u3081\u306e\u5b9f\u88c5\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5236\u7d04\u306e\u4e00\u6642\u7684\u306a\u7121\u52b9\u5316<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function down()\n{\n    Schema::disableForeignKeyConstraints();\n\n    try {\n        \/\/ \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u51e6\u7406\n        Schema::dropIfExists('users');\n        Schema::dropIfExists('user_profiles');\n    } finally {\n        Schema::enableForeignKeyConstraints();\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u524a\u9664\u9806\u5e8f\u306e\u5236\u5fa1<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u6b63\u3057\u3044\u524a\u9664\u9806\u5e8f\u306e\u4f8b\npublic function down()\n{\n    \/\/ 1. \u5b50\u30c6\u30fc\u30d6\u30eb\u306e\u5916\u90e8\u30ad\u30fc\u5236\u7d04\u3092\u524a\u9664\n    Schema::table('order_items', function (Blueprint $table) {\n        $table-&gt;dropForeign(['order_id']);\n    });\n\n    \/\/ 2. \u5b50\u30c6\u30fc\u30d6\u30eb\u3092\u524a\u9664\n    Schema::dropIfExists('order_items');\n\n    \/\/ 3. \u89aa\u30c6\u30fc\u30d6\u30eb\u3092\u524a\u9664\n    Schema::dropIfExists('orders');\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u30b7\u30fc\u30c0\u30fc\u3068\u306e\u9023\u643a\u306b\u3088\u308b\u5b89\u5168\u306a\u5b9f\u884c<\/h3>\n\n\n\n<p>\u30b7\u30fc\u30c0\u30fc\u3068\u9023\u643a\u3057\u305f\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u5f8c\u306e\u30c7\u30fc\u30bf\u5fa9\u65e7\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u74b0\u5883\u5225\u30b7\u30fc\u30c0\u30fc\u306e\u8a2d\u5b9a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ database\/seeders\/DatabaseSeeder.php\npublic function run()\n{\n    if (app()-&gt;environment('local')) {\n        $this-&gt;call([\n            TestDataSeeder::class,\n        ]);\n    } else {\n        $this-&gt;call([\n            ProductionDataSeeder::class,\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u5f8c\u306e\u30c7\u30fc\u30bf\u518d\u6295\u5165<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Console\/Commands\/SafeRollback.php\npublic function handle()\n{\n    DB::transaction(function () {\n        \/\/ 1. \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u4f5c\u6210\n        Artisan::call('db:backup');\n\n        \/\/ 2. \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u5b9f\u884c\n        Artisan::call('migrate:rollback', [\n            '--step' =&gt; $this-&gt;option('step')\n        ]);\n\n        \/\/ 3. \u30b7\u30fc\u30c0\u30fc\u5b9f\u884c\n        if ($this-&gt;option('seed')) {\n            Artisan::call('db:seed', [\n                '--class' =&gt; $this-&gt;option('seeder')\n            ]);\n        }\n    });\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">\u672c\u756a\u74b0\u5883\u3067\u306e\u5b9f\u884c\u6642\u306e\u6ce8\u610f\u70b9<\/h3>\n\n\n\n<p>\u672c\u756a\u74b0\u5883\u3067\u306e\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u5b9f\u884c\u6642\u306e\u91cd\u8981\u306a\u6ce8\u610f\u70b9\u3068\u5bfe\u7b56\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30e2\u30fc\u30c9\u306e\u6d3b\u7528<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    \/\/ 1. \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30e2\u30fc\u30c9\u3092\u6709\u52b9\u5316\n    Artisan::call('down');\n\n    \/\/ 2. \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u5b9f\u884c\n    Artisan::call('migrate:rollback', [\n        '--step' =&gt; 1,\n        '--force' =&gt; true\n    ]);\n} finally {\n    \/\/ 3. \u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30e2\u30fc\u30c9\u3092\u89e3\u9664\n    Artisan::call('up');\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u5b9f\u884c\u8a08\u753b\u306e\u4e8b\u524d\u30ec\u30d3\u30e5\u30fc<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u5bfe\u8c61\u306e\u78ba\u8a8d\nphp artisan migrate:status\n\n# \u5b9f\u884c\u3055\u308c\u308bSQL\u306e\u78ba\u8a8d\nphp artisan migrate:rollback --pretend\n\n# \u5f71\u97ff\u3092\u53d7\u3051\u308b\u30c6\u30fc\u30d6\u30eb\u306e\u78ba\u8a8d\nphp artisan db:show<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u6bb5\u968e\u7684\u306a\u5b9f\u884c\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Services\/MigrationService.php\npublic function safeRollback($step = 1)\n{\n    Log::channel('migrations')-&gt;info('\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u958b\u59cb');\n\n    try {\n        DB::beginTransaction();\n\n        \/\/ 1. \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u4f5c\u6210\n        Artisan::call('db:backup');\n\n        \/\/ 2. \u6bb5\u968e\u7684\u306a\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\n        for ($i = 1; $i &lt;= $step; $i++) {\n            Artisan::call('migrate:rollback', [\n                '--step' =&gt; 1,\n                '--force' =&gt; true\n            ]);\n\n            \/\/ 3. \u6574\u5408\u6027\u30c1\u30a7\u30c3\u30af\n            if (!$this-&gt;verifyDatabaseIntegrity()) {\n                throw new Exception('\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u6574\u5408\u6027\u30a8\u30e9\u30fc');\n            }\n        }\n\n        DB::commit();\n        Log::channel('migrations')-&gt;info('\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u6210\u529f');\n    } catch (Exception $e) {\n        DB::rollBack();\n        Log::channel('migrations')-&gt;error('\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u5931\u6557: ' . $e-&gt;getMessage());\n        throw $e;\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e5\u3064\u306e\u30dd\u30a4\u30f3\u30c8\u3092\u610f\u8b58\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u304b\u3064\u78ba\u5b9f\u306a\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u306e\u5b9f\u884c\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-13\">\u3088\u304f\u3042\u308bRollback\u306e\u30c8\u30e9\u30d6\u30eb\u3068\u89e3\u6c7a\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u304c\u9014\u4e2d\u3067\u6b62\u307e\u308b\u5834\u5408\u306e\u5bfe\u51e6\u6cd5<\/h3>\n\n\n\n<p>\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u304c\u9014\u4e2d\u3067\u505c\u6b62\u3059\u308b\u4e3b\u306a\u539f\u56e0\u3068\u5bfe\u51e6\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u306e\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u5bfe\u7b56<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/database.php\n'mysql' =&gt; [\n    'statement_timeout' =&gt; 600, \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u309210\u5206\u306b\u8a2d\u5b9a\n],\n\n\/\/ \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u3067\u306e\u5bfe\u5fdc\npublic function down()\n{\n    DB::statement('SET SESSION wait_timeout = 600');\n\n    Schema::table('large_table', function (Blueprint $table) {\n        \/\/ \u6642\u9593\u306e\u304b\u304b\u308b\u51e6\u7406\n        $table-&gt;dropIndex('index_name');\n    });\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4e0d\u8db3\u3078\u306e\u5bfe\u51e6<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u8abf\u6574\u306b\u3088\u308b\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u5236\u5fa1\npublic function down()\n{\n    $chunks = DB::table('large_table')\n        -&gt;select('id')\n        -&gt;orderBy('id')\n        -&gt;chunk(1000, function ($records) {\n            foreach ($records as $record) {\n                \/\/ \u5c11\u3057\u305a\u3064\u51e6\u7406\u3092\u5b9f\u884c\n                $this-&gt;processRecord($record);\n            }\n        });\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30ed\u30c3\u30af\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u306e\u89e3\u6c7a<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- \u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u308b\u30d7\u30ed\u30bb\u30b9\u306e\u78ba\u8a8d\nSHOW PROCESSLIST;\n\n-- \u30c7\u30c3\u30c9\u30ed\u30c3\u30af\u306e\u78ba\u8a8d\nSHOW ENGINE INNODB STATUS;\n\n-- \u5fc5\u8981\u306b\u5fdc\u3058\u3066\u30ed\u30c3\u30af\u306e\u89e3\u9664\nKILL [process_id];<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u5916\u90e8\u30ad\u30fc\u5236\u7d04\u306b\u3088\u308b\u30a8\u30e9\u30fc\u306e\u89e3\u6c7a\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5916\u90e8\u30ad\u30fc\u5236\u7d04\u306b\u95a2\u9023\u3059\u308b\u30a8\u30e9\u30fc\u3092\u89e3\u6c7a\u3059\u308b\u305f\u3081\u306e\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5236\u7d04\u306e\u4e00\u6642\u7684\u306a\u7121\u52b9\u5316\u3068\u518d\u6709\u52b9\u5316<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function down()\n{\n    try {\n        \/\/ \u5916\u90e8\u30ad\u30fc\u5236\u7d04\u3092\u4e00\u6642\u7684\u306b\u7121\u52b9\u5316\n        DB::statement('SET FOREIGN_KEY_CHECKS=0');\n\n        \/\/ \u30c6\u30fc\u30d6\u30eb\u306e\u524a\u9664\u51e6\u7406\n        Schema::dropIfExists('child_table');\n        Schema::dropIfExists('parent_table');\n\n    } finally {\n        \/\/ \u5fc5\u305a\u5236\u7d04\u3092\u518d\u6709\u52b9\u5316\n        DB::statement('SET FOREIGN_KEY_CHECKS=1');\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u4f9d\u5b58\u95a2\u4fc2\u3092\u8003\u616e\u3057\u305f\u524a\u9664\u9806\u5e8f\u306e\u5b9f\u88c5<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function down()\n{\n    \/\/ 1. \u4f9d\u5b58\u95a2\u4fc2\u306e\u30de\u30c3\u30d4\u30f3\u30b0\n    $dependencies = [\n        'order_items' =&gt; ['orders'],\n        'orders' =&gt; ['users'],\n        'user_profiles' =&gt; ['users']\n    ];\n\n    \/\/ 2. \u4f9d\u5b58\u95a2\u4fc2\u306b\u57fa\u3065\u3044\u3066\u524a\u9664\u9806\u5e8f\u3092\u6c7a\u5b9a\n    $processed = [];\n    foreach ($dependencies as $table =&gt; $deps) {\n        if (!$this-&gt;canProcessTable($table, $deps, $processed)) {\n            throw new \\Exception(\"\u4f9d\u5b58\u95a2\u4fc2\u306e\u5faa\u74b0\u53c2\u7167\u3092\u691c\u51fa: {$table}\");\n        }\n\n        \/\/ 3. \u30c6\u30fc\u30d6\u30eb\u306e\u524a\u9664\n        Schema::dropIfExists($table);\n        $processed[] = $table;\n    }\n}\n\nprivate function canProcessTable($table, $deps, $processed)\n{\n    foreach ($deps as $dep) {\n        if (!in_array($dep, $processed)) {\n            return false;\n        }\n    }\n    return true;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">migration\u30c6\u30fc\u30d6\u30eb\u306e\u4e0d\u6574\u5408\u306e\u4fee\u6b63\u65b9\u6cd5<\/h3>\n\n\n\n<p>migrations\u30c6\u30fc\u30d6\u30eb\u306e\u4e0d\u6574\u5408\u3092\u4fee\u6b63\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4e0d\u6574\u5408\u306e\u691c\u51fa\u3068\u4fee\u6b63<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Console\/Commands\/FixMigrations.php\npublic function handle()\n{\n    \/\/ 1. \u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u3068DB\u306e\u5dee\u5206\u3092\u691c\u51fa\n    $files = File::glob(database_path('migrations\/*.php'));\n    $dbMigrations = DB::table('migrations')-&gt;pluck('migration')-&gt;toArray();\n\n    $missing = array_diff(\n        array_map(fn($file) =&gt; basename($file, '.php'), $files),\n        $dbMigrations\n    );\n\n    \/\/ 2. \u4e0d\u6574\u5408\u306e\u4fee\u6b63\n    foreach ($missing as $migration) {\n        DB::table('migrations')-&gt;insert([\n            'migration' =&gt; $migration,\n            'batch' =&gt; $this-&gt;getLatestBatch()\n        ]);\n        $this-&gt;info(\"Added missing migration: {$migration}\");\n    }\n}\n\nprivate function getLatestBatch()\n{\n    return DB::table('migrations')-&gt;max('batch') ?? 1;\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30d0\u30c3\u30c1\u756a\u53f7\u306e\u4fee\u6b63<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u7279\u5b9a\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u30d0\u30c3\u30c1\u756a\u53f7\u3092\u4fee\u6b63\nDB::table('migrations')\n    -&gt;where('migration', '2024_02_07_000000_create_users_table')\n    -&gt;update(['batch' =&gt; 1]);\n\n\/\/ \u30d0\u30c3\u30c1\u756a\u53f7\u306e\u9023\u756a\u3092\u632f\u308a\u76f4\u3057\nDB::statement('\n    SET @batch = 0;\n    UPDATE migrations \n    SET batch = (@batch := @batch + 1)\n    ORDER BY id;\n');<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u6574\u5408\u6027\u30c1\u30a7\u30c3\u30af\u30c4\u30fc\u30eb\u306e\u5b9f\u88c5<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function checkMigrationIntegrity()\n{\n    \/\/ 1. \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u306e\u5b58\u5728\u78ba\u8a8d\n    $this-&gt;validateMigrationFiles();\n\n    \/\/ 2. \u30d0\u30c3\u30c1\u756a\u53f7\u306e\u9023\u7d9a\u6027\u78ba\u8a8d\n    $this-&gt;validateBatchSequence();\n\n    \/\/ 3. \u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u306e\u9806\u5e8f\u78ba\u8a8d\n    $this-&gt;validateTimestampOrder();\n\n    \/\/ 4. \u4f9d\u5b58\u95a2\u4fc2\u306e\u78ba\u8a8d\n    $this-&gt;validateDependencies();\n}\n\nprivate function validateMigrationFiles()\n{\n    $files = File::glob(database_path('migrations\/*.php'));\n    $dbMigrations = DB::table('migrations')-&gt;pluck('migration')-&gt;toArray();\n\n    foreach ($dbMigrations as $migration) {\n        $filePath = database_path(\"migrations\/{$migration}.php\");\n        if (!File::exists($filePath)) {\n            throw new \\Exception(\"Missing migration file: {$migration}\");\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u65b9\u6cd5\u3092\u7406\u89e3\u3057\u3001\u9069\u5207\u306b\u5bfe\u5fdc\u3059\u308b\u3053\u3068\u3067\u3001\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u306e\u5931\u6557\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-17\">\u52b9\u7387\u7684\u306aMigration\u7ba1\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u30c6\u30b9\u30c8\u74b0\u5883\u3067\u306e\u4e8b\u524d\u78ba\u8a8d\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>\u30c6\u30b9\u30c8\u74b0\u5883\u3067\u306e\u78ba\u5b9f\u306a\u4e8b\u524d\u78ba\u8a8d\u624b\u9806\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30c6\u30b9\u30c8\u74b0\u5883\u306e\u6e96\u5099<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/database.php\n'testing' =&gt; [\n    'driver' =&gt; 'mysql',\n    'database' =&gt; 'laravel_testing',\n    \/\/ \u672c\u756a\u74b0\u5883\u3068\u540c\u3058\u8a2d\u5b9a\u3092\u4f7f\u7528\n    'charset' =&gt; 'utf8mb4',\n    'collation' =&gt; 'utf8mb4_unicode_ci',\n],\n\n\/\/ \u30c6\u30b9\u30c8\u7528\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c\nclass TestMigrationCommand extends Command\n{\n    public function handle()\n    {\n        \/\/ 1. \u30c6\u30b9\u30c8DB\u4f5c\u6210\n        DB::statement('CREATE DATABASE IF NOT EXISTS laravel_testing');\n\n        \/\/ 2. \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c\n        $this-&gt;call('migrate:fresh', [\n            '--database' =&gt; 'testing',\n            '--seed' =&gt; true\n        ]);\n\n        \/\/ 3. \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u30c6\u30b9\u30c8\n        $this-&gt;call('migrate:rollback', [\n            '--database' =&gt; 'testing',\n            '--step' =&gt; 1\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u81ea\u52d5\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ tests\/Feature\/MigrationTest.php\npublic function test_migration_rollback()\n{\n    \/\/ 1. \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c\n    $this-&gt;artisan('migrate')-&gt;assertSuccessful();\n\n    \/\/ 2. \u30b7\u30fc\u30c0\u30fc\u5b9f\u884c\n    $this-&gt;artisan('db:seed')-&gt;assertSuccessful();\n\n    \/\/ 3. \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u5b9f\u884c\n    $this-&gt;artisan('migrate:rollback')\n        -&gt;expectsQuestion('Are you sure you want to rollback?', 'yes')\n        -&gt;assertSuccessful();\n\n    \/\/ 4. \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u72b6\u614b\u306e\u691c\u8a3c\n    $this-&gt;assertDatabaseMissing('users', []);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">\u30c1\u30fc\u30e0\u958b\u767a\u306b\u304a\u3051\u308brollback\u904b\u7528\u30eb\u30fc\u30eb<\/h3>\n\n\n\n<p>\u30c1\u30fc\u30e0\u958b\u767a\u3067\u306e\u52b9\u679c\u7684\u306a\u30eb\u30fc\u30eb\u3068\u5b9f\u88c5\u4f8b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u306e\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ .github\/pull_request_template.md\n## \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8\n- [ ] up()\u30e1\u30bd\u30c3\u30c9\u3068down()\u30e1\u30bd\u30c3\u30c9\u306e\u5bfe\u79f0\u6027\u3092\u78ba\u8a8d\n- [ ] \u5916\u90e8\u30ad\u30fc\u5236\u7d04\u306e\u9069\u5207\u306a\u51e6\u7406\u3092\u78ba\u8a8d\n- [ ] \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u306e\u30c6\u30b9\u30c8\u3092\u5b9f\u65bd\n- [ ] \u5927\u898f\u6a21\u30c6\u30fc\u30d6\u30eb\u306e\u5834\u5408\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8003\u616e\n- [ ] \u672c\u756a\u30c7\u30fc\u30bf\u3078\u306e\u5f71\u97ff\u3092\u78ba\u8a8d<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30d5\u30a1\u30a4\u30eb\u306e\u547d\u540d\u898f\u5247<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u547d\u540d\u898f\u5247\u306e\u4f8b\nYYYY_MM_DD_HHMMSS_action_target_table.php\n\n# \u5177\u4f53\u4f8b\n2024_02_07_123456_create_users_table.php\n2024_02_07_123457_add_role_to_users_table.php\n2024_02_07_123458_modify_email_in_users_table.php<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30c1\u30fc\u30e0\u5185\u3067\u306e\u5b9f\u884c\u624b\u9806\u306e\u6a19\u6e96\u5316<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Console\/Commands\/TeamMigration.php\npublic function handle()\n{\n    \/\/ 1. \u4e8b\u524d\u30c1\u30a7\u30c3\u30af\n    if (!$this-&gt;confirmProductionSafety()) {\n        return;\n    }\n\n    \/\/ 2. \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u4f5c\u6210\n    $this-&gt;call('db:backup');\n\n    \/\/ 3. \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5b9f\u884c\n    $result = $this-&gt;call('migrate', [\n        '--force' =&gt; true,\n        '--pretend' =&gt; $this-&gt;option('dry-run')\n    ]);\n\n    \/\/ 4. \u5b9f\u884c\u30ed\u30b0\u306e\u8a18\u9332\n    $this-&gt;logMigrationExecution($result);\n}\n\nprivate function confirmProductionSafety()\n{\n    if (app()-&gt;environment('production')) {\n        return $this-&gt;confirm(\n            '\u672c\u756a\u74b0\u5883\u3067\u306e\u5b9f\u884c\u3067\u3059\u3002\u7d9a\u884c\u3057\u307e\u3059\u304b\uff1f',\n            false\n        );\n    }\n    return true;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u30d0\u30fc\u30b8\u30e7\u30f3\u7ba1\u7406\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p>Git\u3068\u306e\u52b9\u679c\u7684\u306a\u9023\u643a\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u30d6\u30e9\u30f3\u30c1\u6226\u7565\u3068\u306e\u6574\u5408<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d5\u30a3\u30fc\u30c1\u30e3\u30fc\u30d6\u30e9\u30f3\u30c1\u3067\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u4f5c\u6210\ngit checkout -b feature\/add-user-roles\nphp artisan make:migration add_role_to_users_table\n\n# \u30de\u30fc\u30b8\u524d\u306e\u30c1\u30a7\u30c3\u30af\ngit diff --name-only database\/migrations\/\nphp artisan migrate:status<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5c65\u6b74\u7ba1\u7406<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ database\/migrations\/MigrationHistory.php\nclass MigrationHistory\n{\n    public static function log($command, $options)\n    {\n        $gitBranch = exec('git rev-parse --abbrev-ref HEAD');\n        $gitCommit = exec('git rev-parse HEAD');\n\n        DB::table('migration_history')-&gt;insert([\n            'command' =&gt; $command,\n            'options' =&gt; json_encode($options),\n            'git_branch' =&gt; $gitBranch,\n            'git_commit' =&gt; $gitCommit,\n            'executed_by' =&gt; Auth::user()-&gt;email ?? 'system',\n            'executed_at' =&gt; now()\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30b9\u30af\u30ea\u30d7\u30c8\u3068\u306e\u7d71\u5408<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ deploy.php\ndesc('Migrate database');\ntask('migrate', function () {\n    \/\/ 1. \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u5c65\u6b74\u306e\u53d6\u5f97\n    $migrationStatus = run('{{bin\/php}} {{release_path}}\/artisan migrate:status');\n\n    \/\/ 2. \u672a\u5b9f\u884c\u306e\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u304c\u3042\u308b\u5834\u5408\u306e\u307f\u5b9f\u884c\n    if (strpos($migrationStatus, 'Pending') !== false) {\n        run('{{bin\/php}} {{release_path}}\/artisan migrate --force');\n    }\n});\n\n\/\/ \u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u7528\u30bf\u30b9\u30af\ndesc('Rollback database');\ntask('rollback', function () {\n    run('{{bin\/php}} {{release_path}}\/artisan migrate:rollback --force');\n});\n\n\/\/ \u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30d5\u30ed\u30fc\u306b\u7d44\u307f\u8fbc\u307f\nafter('deploy:vendors', 'migrate');<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u30c1\u30fc\u30e0\u5168\u4f53\u3067\u3088\u308a\u5b89\u5168\u304b\u3064\u52b9\u7387\u7684\u306a\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u7ba1\u7406\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":{"0":"post-2652","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2652","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2652"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2652\/revisions"}],"predecessor-version":[{"id":2654,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2652\/revisions\/2654"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2652"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2652"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2652"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}