3分钟短文:一看就是干货!Laravel迁移数据库
mhr18 2025-01-21 19:53 19 浏览 0 评论
引言
书接上回。我们讲完了路由,又顺带讲了中间件;接着又讲了控制器,还把路由的数据发到控制器,并且渲染到视图页面。更深入的是,把视图文件的模板也说明白了。
MVC - CVM - VMC,到底缺了哪一个呢?M!
M = Model,是模型层,是与数据库直接对接的那一层设计。我们都知道一切应用的基础,是数据库。数据库也是IT工业的珠穆朗玛峰,看当今天下,多少大中小微企业,哪个不是被数据库卡着脖子。
所以美国要是哪天让Oracle,Microsoft等公司限制出口数据库产品,我们国内的数据库能不能顶上,还未可知。
好了,扯得有点远了,说说本期的要点吧。 我们本期要使用laravel自带的迁移功能,在不操作任何数据库的条件下,完成基础的数据构建。
迁移文件
本文假设你已经正确地配置了环境变量文件,并且通过数据库配置项,系统已经可以正常连接到数据库了。 在项目文件里,不出意外你会在目录 database/migrations 下发现 2014_10_12_000000_create_users_table.php 文件, 这个是laravel自带的用于创建 users 表的迁移文件。只要是实现了两个方法,一个是 up 用于执行命令,一个是 down 用于回滚操作。
来看一下初始的内容,首先是 up 方法:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password', 60);
$table->rememberToken();
$table->timestamps();
});
}
我们主要关心的是字段的数据类型,以及默认值约束,唯一性约束等等。而字段类型也做的很直观,string 对应 varchar 类型。 比如主键默认的自增 id,还有用于记录创建时间 created_at 和 更新时间 updated_at,一个 timestamps() 方法就包含了, 只不过默认使用的是不直观的整型时间戳,如果要使用 datetime 格式用于直观地读取,则可以手动声明:
$table->dateTime('created_at')->comment('创建时间');
$table->dateTime('updated_at')->comment('更新时间');
与创建表方法对应的是回滚时候的删除表,下面是默认的 down 方法:
public function down()
{
Schema::drop('users');
}
其实这个写法有点不保险,如果 users 表不存在的话,我们并不需要执行这条命令。所以,可以完善性地添加一个存在条件判断:
Schema::dropIfExists('users');
这样生成的就是类似下面的额 SQL 语句:
DROP TABLE IF EXISTS databse_name.users;
迁移文件准备完毕,要将该功能应用起来,只需在命令行输入:
php artisan migrate
系统就会执行迁移文件内的内容,并组装好SQL语句发送给数据库执行。
自力更生
那么,上面的是系统自带的迁移文件,开发者如何自己手动生成呢?其实laravel提供了齐备的命令行脚手架, 下面的方法都可以用于创建一个迁移文件:
php artisan make:migration create_users_table
php artisan make:migration add_votes_to_users_table --table=users
php artisan make:migration create_users_table --create=users
第一个仅仅指定了迁移文件名称,一般我们给它起一个直观的名字,方便给自己和维护者提个醒 :-)
第二个使用了 --table 选项指定该迁移文件是对哪个表起作用的。
第三个使用了 --create 选项,这样不仅创建了迁移文件,还顺带着把模型给建好了,一石二鸟!
创建新表没啥好说的,字段类型一定要选好,如果写好了,又进行了迁移,数据库也生效了,这时候,半路上要修改字段类型, 最好数据库里没数据,要是有,可就要遭殃,比如说原本是 varchar(50),有的字段写满了50个字符,现在要修改为 varchar(20), 数据库是不允许的。
可以向上扩展,向下,对不起,数据库说 NO!怎么办?只能手动处理数据到合适的长度再做修改。
而在 laravel 里对一个空表修改字段,完全可以通过,我们创建新的迁移文件,然后在 up 方法内这样调用:
$table->string('name', 100)->change();
看,只用调用一个 change 方法,就搞定了。这个方法最终使用的是类似下面的SQL语句:
alter table `users` alter `name` varchar(100);
当然还可以对字段的默认值约束进行修改:
$table->string('deleted_at')->nullable()->change();
对于插入新的字段,还可以指定位于哪个字段之前或者之后:
$table->string('email')->nullable()->after('last_name');
仅仅修改字段名,只需调用对应方法:
$table->renameColumn('promoted', 'is_promoted');
或者在回滚方法中对某些新增的字段进行删除:
$table->dropColumn('votes');
常用的约束比如主键约束,联合主键约束,唯一性约束,和索引约束。也可以很方便地在声明表,或者修改表的时候进行调用:
$table->primary('primary_id'); // 指定主键
$table->primary(['first_name', 'last_name']); // 联合主键
还有唯一性约束,为存在的字段创建:
$table->unique('email'); // 唯一性
$table->unique('email', 'optional_custom_index_name'); // 指定索引名
为字段创建索引:
$table->index('amount'); // 索引
$table->index('amount', 'optional_custom_index_name'); // 指定索引名
过于复杂的数据库方面的约束,触发器,存储过程,事务等等,是我们所不提倡的,因为溯源有些困难。上面给的这些个方法,足够应对很多很多场景了。
写在最后
本文介绍了laravel中使用迁移功能操作数据库的创建,修改,移除字段,删除表等,把开发者从手动维护数据库的状态中解脱出来。这样也为团队协作时的有章可循做了铺垫。
成熟的开发团队,应该有规范的制度,特别是底层的数据库结构,大家约束在编程层面,方便使用代码库管控和全程追溯。这非常值得推荐。
Happy coding :-)
我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者
- 上一篇:软件学院在线课程云平台正式上线
- 下一篇:php人员需要会什么
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)