Laravel学习笔记(四)数据库 数据库迁移案例

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 创建迁移 首先,让我们创建一个MySql数据库“Laravel_db”。接下来打开app/config目录下的database.php文件。请确保default键值是mysql: 1 return array( 2 .

创建迁移

首先,让我们创建一个MySql数据库“Laravel_db”。接下来打开app/config目录下的database.php文件。请确保default键值是mysql:

1 return array(
2         ...
3         'default' => 'mysql',

然后输入你的数据库配置信息:

 1 ...
 2 'connections' => array(
 3         'mysql' => array(
 4                 'driver'    => 'mysql',
 5                 'host'      => '127.0.0.1',
 6                 'database'  => 'laravel_db', //数据库名
 7                 'username'  => 'root, //你的数据库用户
 8                 'password'  => 'Your_Database_Password', //数据库登录密码
 9                 'charset'   => 'utf8',
10                 'collation' => 'utf8_unicode_ci',
11                 'prefix'    => '',
12         ),
13 ...

我们要使用Laravel命令行工具artisan来创建我们新的迁移。要运行astisan需要打开一个终端,切换路径到Laravel引用程序文件夹的更目录。

第一个我们需要做的就是安装migrations表,这样Laravel就可以追踪哪些迁移已经运行了。下面的命令将会在数据库中创建一个特殊的表:

1 php artisan migrate:install

如下:

 

如果创建成功,artisan会返回“Migration table created successfully.”。

查看数据库,你会发现artisan确实创建了一个新表“migrations”。

你不需要过于关注这个表。这只是一个帮助Laravel监视迁移的表。当你添加新的迁移,artisan migrate会检查migrations表并执行那些没有运行的迁移。

现在,让我们创建一个实际的迁移文件。我想创建一个名为“author”的新表。让我们运行artisan migrate:make命令:

1 php artisan migrate:make create_authors_table

运行截图如下:

 

你会在app/database/migrations目录下看到文件2014_03_11_162133_create_authors_table.php。

正如你看到的,一个新的迁移文件名称中包含时间戳和迁移的描述性名称。

[注]注意细节的读者可能会注意到我们用“authors”问不是“author”命名作者表。这是Laravel设计理念的一方面,使用自然模型帮助我们存储数据模型。Laravel的表应该始终命名为你的数据模型的复数形式。对于Author模型,表就被命名为“authors”。如果你有一个模型Car,你需要命名表为“Cars”。另外,SELECT name FROM authors WHERE id=100SELECT name FROM author WHERE id=100更有意义。

迁移的解剖

迁移是Illuminate\Database\Migrations\MigrationLaravel 类的子类。您创建的类必须至少包含类的两个方法up()和down()。下面是生成由artisan的骨架迁移类:

 1 <?php
 2 use Illuminate\Database\Schema\Blueprint;
 3 use Illuminate\Database\Migrations\Migration;
 4 
 5 class CreateAuthorsTable extends Migration {
 6 
 7     /**
 8      * Run the migrations.
 9      *
10      * @return void
11      */
12     public function up()
13     {
14         //
15     }
16 
17     /**
18      * Reverse the migrations.
19      *
20      * @return void
21      */
22     public function down()
23     {
24         //
25     }
26 }

使用Laravel,我们可以在任何时间迁移到数据模型的特定版本。Up()方法中的代码执行向前迁移,down()执行反向迁移(创建数据库的新版本或者回滚到前一个版本)。

很容易想到up()执行迁移文件操作,down()是完全相反。就像word文档中的撤销命令——撤销所做的修改。例如,我们想创建一个“authors”表,在up()中创建,在down()中撤销。让我们看看应该怎么做。

Artisan migrate:make命令有一些可以加快你工作流的其他选项。让我们运行下面命令:

1 php artisan migrate:make create_authors_table --table authors --create

在上面的例子中,我们使用—table选项指定表名。另外,我添加了—create选项去告知artisan这个表需要被创建。如果我们打开迁移文件,你会发现artisan为我们生成了额外的样板文件代码:

 1 <?php
 2 use Illuminate\Database\Schema\Blueprint;
 3 use Illuminate\Database\Migrations\Migration;
 4 
 5 class CreateAuthorsTable extends Migration {
 6 
 7     /**
 8      * Run the migrations.
 9      *
10      * @return void
11      */
12     public function up()
13     {
14         Schema::table('authors', function(Blueprint $table)
15         {
16             //
17         });
18     }
19 
20     /**
21      * Reverse the migrations.
22      *
23      * @return void
24      */
25     public function down()
26     {
27         Schema::table('authors', function(Blueprint $table)
28         {
29             //
30         });
31     }
32 }

非常棒!现在,让我们做更加具体的工作。我们要使用的 Laravel Schema类来创建我们的"Authors"表。下面是创建作者表,并将必要的列添加到表的迁移代码:

 1 public function up()
 2 {
 3      Schema::create('authors', function(Blueprint $table)
 4     {
 5             // auto increment id (primary key)
 6             $table->increments('id');
 7 
 8             $table->string('name');
 9             $table->integer('age')->nullable();
10             $table->boolean('active')->default(1);
11             $table->integer('role_id')->unsigned();
12             $table->text('bio');
13 
14             // created_at, updated_at DATETIME
15             $table->timestamps();
16       });
17 }

我们调用Schema::create()方法创建一个新表“authors”。Schema::create()方法有两个参数:表名和一个闭包,闭包中包含了列定义。

闭包中,我们可以使用$table参数创建列。列定义方法的基本结构是:

1 $table->column_type(column_name)

列类型

在前面的示例中,我们指定的名称列的类型为"string"。但这是什么意思?数据库中通常没有”string”类型的列。

请记住,Laravel 试图使您的应用程序独立于底层的数据库;例如,如果你想,你可以使用 MySql 开发并部署到 Postgresql。如果您在迁移中使用 MySql 的列类型,应用到 Postgres 数据库可能无法工作。所以,Laravel 迁移通过使用通用的数据类型使你与底层的数据库类型系统隔离。如果我们要迁移 MySql 数据库, string()方法将创建VARCHAR(255)类型的列。在 Postgres,同一迁移可能会添加CHAR VARYING(255)类型的列 (虽然VARCHAR类型支持所有主要的数据库平台)。

Laravel 直接支持以下数据类型:

Laravel 方法

列的类型

increments($column)

向表中添加自动递增的主键

string($column)

添加一个VARCHAR(255)列

string($column, $length)

添加具有长度的VARCHAR

integer($column)

向表中添加一个INTEGER列,

float($column)

向表中添加一个FLOAT的列

decimal($column, $precision, $scale)

添加一个DECIMAL列的精度和小数位数。精度是总数中数字的位数。规模是小数点的右侧的位数。例如,数 123.45 具有精度为 5 和 2 的小数。从逻辑上讲,规模不能大于精度。

boolean($column)

向表中添加一个BOOLEAN的列。注意: 存储布尔值的方式而有所不同从一个数据库到另一个数据库。一些使用"1"和"0"的整数值来表示 true 和 false,个别的,其他人使用"T"和"F"等字符。Laravel 的"boolean"类型映射到数据库的所有系统上的small integer列。Laravel 很好的处理 PHP 的true与false之间的映射,所以你不需要担心。

text($column)

相当于表的TEXT

blob($column)

相当于表的BLOB

binary($column)

相当于表的BINARY

dateTime($column)

相当于表DATETIME

timestamp($column)

相当于表TIMESTAMP

date($column)

相当于表的DATE

time($column)

相当于表的TIME

enum($column, array $allowed)

在表上创建一个新的ENUM列

此外,还有几个你需要知道的扩展方法:

Laravel 方法

列的类型

timestamps()

timestamps()与timestamp()不同。它是一个 Laravel 用来管理创建和修改作为created_at和updated_at TIMESTAMP列的便利方法。他们是 Laravel 可以自己修改的两个特殊的数据库列。created_at列为仅当行被创建时当前时间戳。另一方面, updated_at被修改为每次操作的行的数据时当前时间戳。

nullable()

将指定列允许NULL值。默认情况下,Laravel 使在数据库级别需要通过添加NOT NULL约束的列。

default($value)

设置要用于新行作为初始值的列的默认值。你永远不需要显式设置的默认值为 null。不设置它默认值就为null。

unsigned()

设置INTEGER列为UNSIGNED。

 

参考资料:http://laravelbook.com/laravel-migrations-managing-databases/

 

未完待续……

 

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
13天前
|
SQL 数据库
数据库开发之子查询案例的详细解析
数据库开发之子查询案例的详细解析
14 0
|
13天前
|
SQL 存储 数据库
数据库开发表操作案例的详细解析
数据库开发表操作案例的详细解析
11 0
|
13天前
|
存储 SQL 数据库
数据库设计案例:电商系统数据库设计实践
数据库设计案例:电商系统数据库设计实践
87 1
|
6天前
|
SQL 数据库
数据库数据恢复—sqlserver数据库分区空间不足导致故障的数据恢复案例
数据库数据恢复环境: 某品牌r520服务器,服务器中有7块SAS硬盘,这7块硬盘组建了一组2盘raid1阵列和一组5盘raid5阵列,raid1阵列存储空间安装操作系统,raid5阵列存储空间存放数据。服务器上部署sql server数据库,数据库存放在C盘。 数据库故障: 工作人员发现服务器的C盘容量即将耗尽,于是将sql server数据库路径指向D盘,在D盘生成了一个.ndf文件。一个多星期后,sql server数据库出现故障,连接失效,无法正常附加查询。
数据库数据恢复—sqlserver数据库分区空间不足导致故障的数据恢复案例
|
13天前
|
Java 数据库连接 程序员
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
【后台开发】TinyWebser学习笔记(2)线程池、数据库连接池
27 4
|
13天前
|
SQL 存储 小程序
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
数据库数据恢复环境: 5块硬盘组建一组RAID5阵列,划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库,存储空间在操作系统层面划分了三个逻辑分区。 数据库故障: 数据库文件丢失,主要涉及3个数据库,数千张表。数据库文件丢失原因未知,不能确定丢失的数据库文件的存放位置。数据库文件丢失后,服务器仍处于开机状态,所幸未写入大量数据。
数据库数据恢复—Sql Server数据库文件丢失的数据恢复案例
|
13天前
|
SQL 存储 数据挖掘
数据库数据恢复—数据库ndf文件大小变为0KB的数据恢复案例
存储设备损坏导致存储中SQL Server数据库崩溃。对数据库文件进行恢复后,用户发现有4个ndf文件的大小变为0KB。该SQL Server数据库每10天生成一个大小相同的NDF文件,该SQL Server数据库包含两个LDF文件。
|
13天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
13天前
|
Java 关系型数据库 测试技术
Java代码一键生成数据库文档(案例详解)
Screw是一个自动化数据库文档生成工具,能根据数据库表结构快速生成简洁、多格式(HTML、Word、Markdown)的文档,支持MySQL、MariaDB等多数据库。它使用Freemarker模板,允许用户自定义样式。依赖包括HikariCP数据库连接池和对应JDBC驱动。通过在Java代码或Maven插件中配置,可方便生成文档。示例代码展示了如何在测试用例中使用Screw。文档效果依赖于数据库中的表和字段注释。
|
13天前
|
存储 搜索推荐 数据库
如何选择合适的矢量数据库:选型指南与案例分析
【4月更文挑战第30天】面对众多矢量数据库,如何选择合适的?本文提供了一份选型指南和案例分析。首先,明确业务需求,如推荐系统、图像检索等场景的不同需求;其次,评估数据量,大型项目需选择支持分布式架构的数据库;再者,关注查询性能、技术成熟度和成本。案例中,电商企业选用Faiss实现高效推荐,而互联网公司则因大规模图像检索选择了Milvus,后者以其扩展性和准确性脱颖而出。选择矢量数据库需综合考虑,结合实际以找到最佳匹配。