修改理由:

优化标点符号使用,删除多余空行

相关信息:


此投稿已在 4年前 合并。

内容修改:

红色背景 为原始内容

绿色背景 为新增或者修改的内容

OldNewDifferences
1  
21# 数据库:迁移
32
43- [介绍](#introduction)
 
3130<a name="generating-migrations"></a>
3231## 生成迁移
3332
34 使用 `make:migration` [Artisan 命令](/docs/laravel/8.x/artisan) 命令来创建迁移:
 33使用 `make:migration` [Artisan 命令](/docs/laravel/8.x/artisan) 命令来创建迁移:
3534
3635   php artisan make:migration create_users_table
3736
38   
3937新的迁移文件将会放在 `database/migrations` 目录下。 所有的迁移文件名称都会包含一个时间戳,Laravel 将据此决定迁移文件运行的顺序。
4038
41 > 提示:迁移 stubs 必须使用 [stub publishing](/docs/laravel/8.x/artisan#stub-customization) 进行自定义
42 
 39> 提示:迁移 stubs 必须使用 [stub publishing](/docs/laravel/8.x/artisan#stub-customization) 进行自定义。
4340
4441`--table` 和 `--create` 选项也可用于确定表的名称以及是否在迁移中创建新的数据表。这些选项用指定的迁移模板预先填充指定的数据表:
4542
 
4744
4845   php artisan make:migration add_votes_to_users_table --table=users
4946
50 
51 
52 这里提到的操作,是将会为生成的迁移文件指定自定义的输出路径, 您在执行`make:migration` 命令时,可以尝试使用`--path` 参数。 给定的路径是以应用程序文件夹为相对路径。
 47这里提到的操作,是将会为生成的迁移文件指定自定义的输出路径, 您在执行 `make:migration` 命令时,可以尝试使用 `--path` 参数。 给定的路径是以应用程序文件夹为相对路径。
5348
5449<a name="squashing-migrations"></a>
5550### 迁移转储(迁移合并)
5651
57 随着时间,您构建的应用程序中的迁移会积累的越来越多。这会使您的目录变得臃肿,甚至会有数百个迁移文件。所以,如果您愿意,您可以将若干个迁移文件,压缩到单个SQL文件中。进行这个操作,需要执行的命令是:`schema:dump`。
58 示例:
 52随着时间,你构建的应用程序中的迁移会积累的越来越多。这会使目录变得臃肿,甚至会有数百个迁移文件。所以,如果你愿意,你可以将若干个迁移文件,压缩到单个SQL文件中。进行这个操作,需要执行的命令是:`schema:dump`。
 53示例
5954
6055   php artisan schema:dump
6156
62    // 上面示例为转储但不删除原有迁移文件,下面示例为转储且删除原有迁移文件
 57   // 上面示例为转储但不删除原有迁移文件,下面示例为转储且删除原有迁移文件
6358   php artisan schema:dump --prune
6459
65 在执行以上命令后,Lravel将会把转储后的SQL文件,放置到您项目的`database/schema` 目录中。
66 
67 在进行转储操作后,当您尝试进行迁移操作时,在未指定迁移文件的默认情况下,Laravel将会首先执行SQL文件的内容。在执行SQL文件后,Laravel将会继续执行其他迁移文件。
 60在执行以上命令后,Lravel将会把转储后的SQL文件,放置到您项目的 `database/schema` 目录中。
 61
 62在进行转储操作后,当您尝试进行迁移操作时,在未指定迁移文件的默认情况下,Laravel 将会首先执行SQL文件的内容。在执行SQL文件后,Laravel 将会继续执行其他迁移文件。
6863
6964数据库迁移的核心作用是,使团队中的其他开发人员,可以快速的创建该项目的初始数据库结构。
70 所以在完成项目的数据库架构修改后,您应该将数据库架构文件提交至代码管理员、项目负责人或是Git类项目共享平台,这将大大提高您项目团队的效率和共协能力。
71 
72 > 注意:迁移转储功能仅适用于 MySQL, PostgreSQL和 SQLite数据库。
 65所以在完成项目的数据库架构修改后,您应该将数据库架构文件提交至代码管理员、项目负责人或是 Git 类项目共享平台,这将大大提高您项目团队的效率和共协能力。
 66
 67> 注意:迁移转储功能仅适用于 MySQL,PostgreSQL 和 SQLite 数据库。
7368
7469<a name="migration-structure"></a>
7570## 迁移的操作方法
7671
7772面对的迁移的操作有两个方法: `up` 和 `down`。方法`up` 的作用是向数据库中添加新的表或列或索引,而 `down` 的方法,就是`up` 方法的反向操作。
7873
79  
80  
8174在这两种方法中,您可以使用 Laravel 的 `Schema` 生成器显式地创建和修改表。要了解 `Schema` 生成器上可用的所有方法,[请查看其文档](#creating-tables)。例如,以下迁移将创建一个 `flights` 表:
8275
8376   <?php
 
117110<a name="running-migrations"></a>
118111## 执行迁移
119112
120 执行以下 `migrate` Artisan 命令,来执行未执行过的迁移
 113执行以下 `migrate` Artisan 命令,来执行未执行过的迁移
121114
122115   php artisan migrate
123116
 
125118
126119#### 在生产环境中强制执行迁移
127120
128 有些迁移操作是破坏性的,这意味着它们可能会导致数据丢失。为了防止您对生产数据库运行这些命令,在执行这些命令之前,系统将提示您进行确认。要在运行强制命令的时候去掉提示,请使用 `-force` 标志:
 121有些迁移操作是破坏性的,这意味着它们可能会导致数据丢失。为了防止您对生产数据库运行这些命令,在执行这些命令之前,系统将提示您进行确认。要在运行强制命令的时候去掉提示,请使用 `-force` 标志:
129122
130123   php artisan migrate --force
131124
 
140133
141134   php artisan migrate:rollback --step=5
142135
143 
144 
145 如果您在迁移后觉得有误,可以使用重置命令 `migrate:reset` ,回滚刚才进行的所有迁移操作,以恢复到上一次迁移状态。
 136如果您在迁移后觉得有误,可以使用重置命令 `migrate:reset`,回滚刚才进行的所有迁移操作,以恢复到上一次迁移状态。
146137
147138示例:
148139
 
150141
151142#### 使用一个命令同时进行回滚和迁移操作
152143
153 使用 `migrate:refresh`命令将会回滚您的所有迁移操作,然后Laravel将自己继续执行 `migrate` 命令进行重新迁移。同时可在该命令后跟用`--seed`,这个参数的作用是在“刷新”完成数据库之后,对后面新增的迁移文件进行迁移。
 144使用 `migrate:refresh` 命令将会回滚您的所有迁移操作,然后 Laravel 将自己继续执行 `migrate` 命令进行重新迁移。同时可在该命令后跟用 `--seed`,这个参数的作用是在“刷新”完成数据库之后,对后面新增的迁移文件进行迁移。
154145
155146示例:
156147   php artisan migrate:refresh
157148
158    // 上列是刷新当前已有的迁移,下列是刷新当前已有的迁移后,更新未有的迁移
 149   // 上列是刷新当前已有的迁移,下列是刷新当前已有的迁移后,更新未有的迁移
159150   php artisan migrate:refresh --seed
160151
161152在`migrate:refresh`中,您还可以使用 `step` 参数来一次性选择回滚的次数。例如,以下命令将回滚并重新迁移最后五次迁移:
 
177168<a name="creating-tables"></a>
178169### 创建数据表
179170
180 接下来我们将使用`Schema` 的 `create`方法,创建一个新的数据表。 `create` 方法中可以接受两个参数,一个是表格的名称,第二个是 `Closure` ,作用是可以在定义一个新数据表的时候接受 `Blueprint` 对象.
 171接下来我们将使用`Schema` 的 `create`方法,创建一个新的数据表。 `create` 方法中可以接受两个参数,一个是表格的名称,第二个是 `Closure`,作用是可以在定义一个新数据表的时候接受 `Blueprint` 对象。
181172示例:
 173  
182174   Schema::create('users', function (Blueprint $table) {
183175       $table->id();
184176   });
 
187179
188180#### 检查表/列是否存在
189181
190 您可以使用 `hasTable` 和 `hasColumn` 方法来检测表/列是否存在:
 182您可以使用 `hasTable` 和 `hasColumn` 方法来检测表/列是否存在
191183
192184   if (Schema::hasTable('users')) {     #如果不存在'users'表则执行
193185       //
 
199191
200192#### 数据库连接 & 数据表选项
201193
202  
203  
204194如果要对非默认连接的数据库连接执行结构操作,可以使用 `connection` 方法:
205195
206196   Schema::connection('foo')->create('users', function (Blueprint $table) {
 
245235       $table->string('email');
246236   });
247237
248  
249  
250238#### 可用的字段类型
251239
252240数据库结构生成器包含构建表时可以指定的各种字段类型:
 
315303`$table->uuid('id');` | 相当于 UUID
316304`$table->year('birth_year');` | 相当于 YEAR
317305
318  
319  
320306<a name="column-modifiers"></a>
321307### 字段修饰
322308
323 除了上述列出的字段类型之外,还有几个可以在添加字段到数据库表时使用的 「修饰符」。例如,如果要把字段设置为「可空」,你可以使用 `nullable` 方法:
 309除了上述列出的字段类型之外,还有几个可以在添加字段到数据库表时使用的「修饰符」。例如,如果要把字段设置为「可空」,你可以使用 `nullable` 方法:
324310
325311   Schema::table('users', function (Blueprint $table) {
326312       $table->string('email')->nullable();
 
376362
377363> 注意:支持哪些默认值的表示方式取决于你的数据库驱动、数据库版本、还有字段类型。请参考合适的文档使用。还有一点要注意的是,使用数据库特定函数,可能会将你绑牢到特定的数据库驱动上。
378364
379  
380  
381365<a name="modifying-columns"></a>
382366### 修饰字段
383367
 
423407       $table->dropColumn('votes');
424408   });
425409
426  
427  
428410你可以传递一个字段数组给 `dropColumn` 方法来删除多个字段:
429411
430412   Schema::table('users', function (Blueprint $table) {
431413       $table->dropColumn(['votes', 'avatar', 'location']);
432414   });
433415
434 > 注意:使用 SQLite 数据库时不支持在单个迁移中**删除**或**修改**多个字段。
 416> 注意:使用 SQLite 数据库时不支持在单个迁移中 **删除** 或 **修改** 多个字段。
435417
436418#### 可用的命令别名
437419
 
478460`$table->index('state');` | 添加普通索引
479461`$table->spatialIndex('location');` | 添加空间索引(不支持 SQLite)
480462
481  
482  
483463#### 关于 MySQL 和 MariaDB 的索引长度
484464
485465Laravel 默认使用 utf8mb4 编码,它支持在数据库中储存 emojis 。如果你是在版本低于 5.7.7 的 MySQL 或者版本低于 10.2.2 的 MariaDB 上创建索引,那你就需要手动配置数据库迁移的默认字符串长度。即在 `AppServiceProvider` 中调用 `Schema::defaultStringLength` 方法来配置它:
486466
487467   use Illuminate\Support\Facades\Schema;
488468
489        /**
490         * Bootstrap any application services.
491         *
492         * @return void
493         */
494        public function boot()
495        {
496            Schema::defaultStringLength(191);
497        }
 469   /**
 470    * Bootstrap any application services.
 471    *
 472    * @return void
 473    */
 474   public function boot()
 475   {
 476        Schema::defaultStringLength(191);
 477   }
498478
499479当然,你也可以选择开启数据库的 `innodb_large_prefix` 选项。至于如何正确开启,请自行查阅数据库文档。
500480
501481<a name="renaming-indexes"></a>
502482### 重命名索引
503483
504 若要重命名索引,你需要调用 `renameIndex` 方法。此方法接受当前索引名称作为其第一个参数,并将所需名称作为其第二个参数:
 484若要重命名索引,你需要调用 `renameIndex` 方法。此方法接受当前索引名称作为其第一个参数,并将所需名称作为其第二个参数
505485
506486   $table->renameIndex('from', 'to')
507487
 
517497`$table->dropIndex('geo_state_index');` | 从 「geo」 表中删除基本索引
518498`$table->dropSpatialIndex('geo_location_spatialindex');` | 从 「geo」 表中删除空间索引(不支持 SQLite)
519499
520  
521  
522500如果将字段数组传给 `dropIndex` 方法,会删除根据表名、字段和键类型生成的索引名称。
523501
524502   Schema::table('geo', function (Blueprint $table) {
 
548526       $table->foreignId('user_id')->constrained('users');
549527   });
550528
551 
552 你可以为约束的 「on delete」 和 「on update」 属性指定所需的操作:
 529你可以为约束的「on delete」和「on update」属性指定所需的操作:
553530
554531   $table->foreignId('user_id')
555532         ->constrained()
 
561538         ->nullable()
562539         ->constrained();
563540
 541要删除一个外键,你需要使用 `dropForeign` 方法,将要删除的外键约束作为参数传递。外键约束采用的命名方式与索引相同。即,将数据表名称和约束的字段连接起来,再加上 `_foreign` 后缀:  
 542  
 543   $table->dropForeign('posts_user_id_foreign');  
 544  
 545或者,可以给 `dropForeign` 方法传递一个数组,该数组包含要删除的外键的列名。数组将根据 Laravel 的 Schema 生成器使用的约束名称约定自动转换:  
 546  
 547   $table->dropForeign(['user_id']);  
 548  
 549你可以在迁移文件中使用以下方法来开启或关闭外键约束:  
 550  
 551   Schema::enableForeignKeyConstraints();  
 552  
 553   Schema::disableForeignKeyConstraints();  
 554  
 555> 注意:SQLite 默认禁用外键约束。使用 SQLite 时,请确保在数据库配置中启用 [启用外键支持](https://learnku.com/docs/laravel/8.x/configuration/9355) 然后再尝试在迁移中创建它们。另外, SQLite只在创建表时支持外键,并且 [在修改表时就不会了](https://www.sqlite.org/omitted.html)。  
 556  
564557
565  
566 要删除一个外键,你需要使用 `dropForeign` 方法,将要删除的外键约束作为参数传递。外键约束采用的命名方式与索引相同。即,将数据表名称和约束的字段连接起来,再加上 `_foreign` 后缀:  
567   
568    $table->dropForeign('posts_user_id_foreign');  
569   
570 或者,可以给 `dropForeign` 方法传递一个数组,该数组包含要删除的外键的列名。数组将根据 Laravel 的 Schema 生成器使用的约束名称约定自动转换  
571   
572    $table->dropForeign(['user_id']);  
573   
574 你可以在迁移文件中使用以下方法来开启或关闭外键约束:  
575   
576    Schema::enableForeignKeyConstraints();  
577   
578    Schema::disableForeignKeyConstraints();  
579   
580 > 注意:SQLite 默认禁用外键约束。 使用 SQLite 时,请确保在数据库配置中启用 [启用外键支持](https://learnku.com/docs/laravel/8.x/configuration/9355) 然后再尝试在迁移中创建它们。另外, SQLite只在创建表时支持外键,并且 [在修改表时就不会了](https://www.sqlite.org/omitted.html)。  
581  
582