前言
@H_404_3@这是一篇基础教程,对标 Laravel 文档中的和,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍把。@H_404_3@
关于Laravel数据库迁移的理解
@H_404_3@最初看到laravel框架中迁移的时候,会以为这个迁移是把数据从一个数据库中迁到另一个数据库中,又或者是从一个服务器迁移到另一个服务器中。我自己学习有一个学习方法叫做顾名思义,所以所述是我的第一反应,但是学了以后发现这个迁移不是我理解中的迁移,但又不知道为什么叫做迁移,所以去百科查了一下。 @H_404_3@
迁移是指已经获得的知识、技能,甚至方法和态度对学习新知识、新技能的影响。这种影响可能是积极的,也可能是消极的,前者叫正迁移或简称迁移,后者叫负迁移或干扰。迁移首先是使习得的经验得以概括化、系统化,形成一种稳定的整合的心理结构,从而更好地调节人的行为,并能动地作用于客观世界。迁移是向能力转化的关键。能力的形成一方面依赖于知识、技能的掌握;另一方面也依赖于所掌握知识和技能的不断概括化、系统化。——引用于360百科 @H_404_3@
看完上面的百科说明,其实才明白什么叫做数据库迁移,总结一下,迁移是指某种影响,所以数据库迁移是通过对迁移文件的修改对数据库造成的影响,这种影响其实就是操作数据库。 @H_404_3@
换句通俗的话说,是在laravel中有一个文件,这个文件中写了laravel本身内置的对数据库的“命令“,例如可以创建修改删除库、表、字段。通过这些文件中的代码,便可以通过版本控制达到控制数据库的目的,至于如何通过文件操作数据库,我们可以看文档中的具体说明。@H_404_3@
migration
@H_404_3@Laravel 中提供了数据库迁移的方式来管理数据库,想象一个场景:在一个多人开发的项目中,你的同事修改了某个数据库结构并修改了代码,通过 git 你可以即时的同步同事修改的代码,但是数据库结构,你只能通过手工的方式来复制同事修改的 sql 语句,执行以保证数据库的结构一致。那么,Laravel 中的数据库迁移概念,就是用于解决团队中保证数据库结构一致的方案。 @H_404_3@
migration 使用非常简单,编写一定的 PHP 代码并执行,那么 Laravel 就会自动的更新数据库。假设你的同事要修改数据库某个字段,那么只要编写 PHP 代码,接着你通过 git 更新了代码,执行 migrate 操作之后,你的数据库结构就和他的同步了。下面我们就来看具体的使用方法。 @H_404_3@
migrate
@H_404_3@Laravel 把编写数据库改动的 PHP 代码称为迁移,可以通过 PHP artisan make:migration filename
的方式来创建迁移文件。假设你需要创建一张新的 user 表,那么你可以通过执行 PHP artisan make:migration create_user_table --create=user
来创建一个迁移文件,执行命令会在 database/migrations/ 目录下建立一个 文件创建时间_filename 的 PHP 文件,那么这个文件就是我们接下来用来编写数据库结构变化的文件了。这里要提一点,虽然说创建迁移文件的名称可以随意,但是为了管理方便,最好文件名可以体现要执行的数据库操作,比如这里我们要创建一张 user 表,所以文件名称为 create_user_table。
@H_404_3@
PHP artisan make:migration filename 有两个可选参数
@H_404_3@- --create=tablename 表明该迁移是用来创建表。
- --table=tablename 表明该迁移是用来对 tablename 这张表进行操作。
我们创建出来的迁移文件 create_user_table 会包含两个方法。@H_404_3@
public function down()
{
Schema::dropIfExists('user');
}
这两个方法是互逆的操作,比如我们可以再 up 方法中编写我们要创建的 user 表的相关信息,而 down 方法中则是删除 user 表的操作。这样,我们就可以做到回滚操作,当我们创建 user 表之后发现某个字段名写错了,就可以通过 down 来删除 user 表,进而重新建立 user 表。 @H_404_3@
假设 user 表有 id,username,email 三个字段,那么可以再 up 方法中写 @H_404_3@
一般,我们的逻辑会在闭包函数中写。上面的代码,即时不能完全明白,也可以大概猜出以下几点:@H_404_3@
- 我们操作的表是 user 表。
- user 表中定义了 id 字段,因为调用了 increments 方法,所以 id 为 auto_increment,调用了 index 方法说明给 id 添加了索引,最后 comment 等同于注释。
- 有了 id 的经验,那么 name 字段也很好理解了,string 方法说明 name 是 varchar/char 类型的,default 定义了 name 字段的默认值。
- email 字段 调用了 nullable 方法说明运行 email 字段为空。
- 定义字段结构的时候可以使用链式调用的方式。
Laravel 中的方法是满足你对 sql 语句的所有操作,如果你需要定义一个类型为 text 的字段,那么可以调用 text() 方法,更多的方法说明可以参见文档 Laravel 数据库结构构造器。 @H_404_3@
我们已经编写好了 user 表的结构,接下来执行 PHP artisan migrate
,Laravel 会根据 create 方法自动为我们创建 user 表。至此,我们已经成功的通过 Larvel 的迁移功能来实现创建表。
@H_404_3@
Rollback
@H_404_3@使用 Laravel 的迁移功能可以有后悔药吃。 @H_404_3@
执行 PHP artisan migrate
创建 user 表之后,觉得不行,不要 user 这张表,于是你打算删除这张表。那么这时候我们就要使用刚刚说到的 down 方法了。
@H_404_3@
这里 Laarvel 已经为我们写好逻辑了,dropIfExists 函数就是用来删除表,我们只需要执行 PHP artisan migrate :rollback
就可以回滚到执行 PHP artisan migrate
之前的状态。
@H_404_3@
重命名表
@H_404_3@除了创建表,也可以用迁移记录表的其他任何操作,包括修改表属性,修改字段等等操作。这里再举个例子说明如何用迁移来对表进行重命名。@H_404_3@
1、假设有表 user,我们需要对它重命名为 users。首先要执行 PHP artisan make:migration rename_user_to_users --table user
来创建迁移文件。@H_404_3@
2、在 up 方法中写我们要重命名表的逻辑。@H_404_3@
3、为了可以 rollback 可以顺利执行,我们还需要在 down 方法中编写撤销重命名操作的逻辑。@H_404_3@
4、最后执行 PHP artisan migrate
就就可以完成对 user 表的重命名操作。如果需要回滚,只要执行 PHP artisan migrate:rollback
。@H_404_3@
你会发现,如果执行一次迁移之后,如果执行第二次迁移是不会重复执行的,这是因为 Laravel 会在数据库中建立一张 migrations 的表来记录哪些已经进行过迁移。 @H_404_3@
基本的 migration 介绍就到这里,以上的内容可以应对大部分的需求,如果需要更详细的介绍,可能需要阅读 Laravel 那不知所云的文档了。:) @H_404_3@
Seeder
@H_404_3@Laravel 中除了 migration 之外,还有一个 seeder 的东西,这个东西用于做数据填充。假设项目开发中需要有一些测试数据,那么同样可以通过编写 PHP 代码来填充测试数据,那么通过 git 同步代码,所有的人都可以拥有一份同样的测试数据。@H_404_3@
同样,数据填充在 Laravel 中被称为 Seeder,如果需要对某张表填充数据,需要先建立一个 seeder。通过执行 PHP artisan make:seeder UserTableSeeder 来生成一个 seeder 类。这里我们希望填充数据的表示 test 表,所以名字为 UserTableSeeder。当然这个名字不是强制性的,只是为了做到见名知意。 @H_404_3@
创建 UserTableSeeder 之后会在 database/seeders 目录下生成一个 UserTableSeeder 类,这个类只有一个 run 方法。你可以在 run 方法中写插入数据库的代码。假设我们使用 DB facade 来向 test 表插入数据。 @H_404_3@
{
DB::table('users')->insert($insertData);
}
}
编写完代码之后,执行 PHP artsian db:seeder --class= UserTableSeeder
来进行数据填充。执行完毕之后查看数据库已经有数据了。
@H_404_3@
如果我们有多个表要进行数据填充,那么不可能在编写完 PHP 代码之后,逐个的执行 PHP artisan db:seeder --class=xxxx
来进行填充。有一个简便的方法。在 DatabaseSeeder 的 run 方法中添加一行 $this->call(UserTableSeeder::class);
,然后执行 PHP artisan db:seeder
,那么 Laravel 就会执行 DatabaseSeeder 中的 run 方法,然后逐个执行迁移。
@H_404_3@
和 migration 不同,如果多次执行 PHP artisan db:seeder
就会进行多次数据填充。
@H_404_3@
加入你想一次性插入大量的测试数据 ,那么在 run 方法中使用 DB facade 来逐个插入显然不是一个好的方法。Laravel 中提供了一种模型工厂的方式来创建创建大量的数据。 @H_404_3@
模型工厂
@H_404_3@模型工厂,意味着本质其实是一个工厂模式。那么,在使用模型工厂创建数据需要做两件事情@H_404_3@
Laravel 中通过执行 PHP artisan make:factory UserFactory --model=User
来为 User Model 创建一个工厂类,该文件会放在 database/factory 目录下。打开该文件可以看到如下代码:
@H_404_3@
这里, return 的值就是我们第 2 步调用工厂获取到的数据。生成数据的逻辑也只需要写在闭包函数中就可以。这里需要提一下 Faker 这个类。这是一个第三方库,Laravel 集成了这个nofollow" target="_blank" href="https://github.com/fzaninotto/Faker">第三方库。这个库的作用很好玩:**用于生成假数据。**假设 User 表需要插入 100 个用户,那么就需要 100 个 username,那么你就不必自己写逻辑生成大量的 test01,test02 这样子幼稚的假数据,直接使用 Faker 类,会替你生成大量逼真的 username。(我也不知道这个算不算无聊了 :)。。。)。 @H_404_3@
现在假设 User 表有 id,email,username 三个字段,那么我要生成 100 个用户,首先在工厂类中实现逻辑。 @H_404_3@
现在,我们已经定义好了工厂,现在我们就要在 UserSeeder@run 函数中使用模型工厂来生成测试数据。@H_404_3@
{
factory(App\User::class)->times(10)->make()->each(function($user,$index){
$user->save();
});
}
}
run 函数中这一波行云流水的链式调用在我刚刚开始接触 Laravel 的时候也是一脸黑线,不过习惯之后感觉这代码可读性确实很强@H_404_3@
factory(App\User::class)
指明返回哪个工厂,参数 App\User::class 就是工厂的唯一标识。这里我们在定义工厂的时候 define 的第一个参数已经指明了。- ->times(10) 指明需要工厂模式生成 10 个 User 数据。即会调用 10 次 define 函数的第二个参数。
- ->make() 把生成的 10 个 User 数据封装成 Laravel 中的集合对象。
- ->each() 是 Laravel 集合中的函数,each 函数会针对集合中的每个元素进行操作。这里直接把数据保存到数据库。
好了,数据迁移和数据填充的基本操作也就这些了。更多复杂的用法。。。。也不一定能用上。@H_404_3@
总结
@H_404_3@以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持。@H_404_3@