多个Laravel项目如何共用migrations详解


Posted in PHP onSeptember 25, 2018

前言

在实际开发中,我们可能经常会遇到一个项目会建立两个 Laravel 项目,一个是面向用户的 web/API,一个是管理员后台,这两个项目一般情况下是共用一个数据库的,那么我们的 migration 可以共用吗?该怎么操作?

Migration就相当于数据库的版本控制工具,可以使用

php artisan migration

生成数据库表,但前提是要在database目录下有相应的表的PHP文件

下面话不多说了,来一起看看详细的介绍吧

在各项目里建各自 migration

我们先在 web/API 和 admin 里都建各自的 migration:

## web 目录

php artisan make:migration foo
# Created Migration: 2018_09_19_144940_foo

php artisan migrate
# Migration table created successfully.
# Migrating: 2018_09_19_144940_foo
# Migrated: 2018_09_19_144940_foo

php artisan migrate:status
# +------+-----------------------+-------+
# | Ran? | Migration    | Batch |
# +------+-----------------------+-------+
# | Yes | 2018_09_19_144940_foo | 1  |
# +------+-----------------------+-------+

## admin 目录

php artisan make:migration bar
# Created Migration: 2018_09_19_145255_bar

php artisan migrate
# Migrating: 2018_09_19_145255_bar
# Migrated: 2018_09_19_145255_bar

php artisan migrate:status
# +------+-----------------------+-------+
# | Ran? | Migration    | Batch |
# +------+-----------------------+-------+
# | Yes | 2018_09_19_144940_foo | 1  |
# +------+-----------------------+-------+
# | Yes | 2018_09_19_145255_bar | 2  |
# +------+-----------------------+-------+

从 artisan migrate:status 的结果来看,两个 migration 都正常执行了,接下来我们试一下回滚操作。

先直接在 web 目录执行

php artisan migrate:rollback
# Migration not found: 2018_09_19_145255_bar

报错了,因为在 web 项目里找不到 bar 这个 migration 文件;那如果我们刚刚是直接在 admin 目录执行,是能够正常回滚的,但是如果我们指定回滚两个版本:

php artisan migrate:rollback --step=2

# Migration not found: 2018_09_19_144940_foo
# Rolling back: 2018_09_19_145255_bar
# Rolled back: 2018_09_19_145255_bar

这次回滚操作也是有问题的,只回滚了一半。

所以我们应该按照 migrate 的相反顺序执行回滚,即先在 admin 执行一次,然后再到 web 里再执行一次。我们上面的实验很简单,要记住这些顺序也不难,可是在实际的项目中,你的 migrations 就比这个复杂多了,而且只通过 migrate:status 你也看不出来执行顺序到底是怎么样的,所以在各个项目里各自维护各自的 migrations 似乎行不通...

共用一份 migration

上面的实验我们可以知道,我们在执行 artisan migrate 的时候,Laravel 会读取 migrations 目录里的文件和数据库里的记录,然后再执行相应的操作(并记录这次操作);回滚的时候 Laravel 会读取数据库中的记录,然后执行 migrations 目录里相应的文件中的 down 方法。

而当 migrations 分散在不同的项目(目录)里的时候,不管你在哪个项目中执行 migrate:rollback 时,都可能只有一部分 migration 文件被加载进来,因此会造成一些奇奇怪怪的问题。

那我们可以将所有 migrations 放在同一个地方,怎么操作呢?再建一个新的项目似乎有点麻烦了...我们先看看帮助吧:

php artisan migrate --help

Description:
 Run the database migrations

Usage:
 migrate [options]

Options:
  --database[=DATABASE] The database connection to use
  --force    Force the operation to run when in production
  --path[=PATH]   The path to the migrations files to be executed
  --realpath    Indicate any provided migration file paths are pre-resolved absolute paths
  --pretend    Dump the SQL queries that would be run
  --seed     Indicates if the seed task should be re-run
  --step     Force the migrations to be run so they can be rolled back individually
 -h, --help     Display this help message
 -q, --quiet    Do not output any message
 -V, --version    Display this application version
  --ansi     Force ANSI output
  --no-ansi    Disable ANSI output
 -n, --no-interaction  Do not ask any interactive question
  --env[=ENV]   The environment the command should run under
 -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

果然有我们想要的东西:--path 和 --realpath,先来看看这两个参数是什么用途:

--path[=PATH]  指定 migrations 文件的路径
--realpath     表示 --path 指定的路径为绝对路径

那我们在进行 migrations 操作的时候,指定同一个路径,那就可以共用 migrations 了:

php artisan make:migration foo --path="../admin/database/migrations"

# or

php artisan make:migration foo --path="/the/absolute_path/to/admin/database/migrations" --realpath


# migrate
php artisan migrate --path="../admin/database/migrations"

# migrate:rollback
php artisan migrate:rollback --path="../admin/database/migrations"

注:当你不带 --realpath 的时候,path 是以项目的根目录为 / 的

总结

所以,当我们需要在多个 Laravel 项目中共用 migrations 的时候,最好的做法是通过 --path 指定 migrations 文件的目录,这个目录可以是一个独立的 git repo,也可以是其中一个 Laravel 项目(我个人推荐放在其中一个项目中,采用独立的 git 分支),这样既可以共用 migrations,在团队协作的时候也不会混乱和出现冲突

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
新手学PHP之数据库操作详解及乱码解决!
Jan 02 PHP
PHP中动态显示签名和ip原理
Mar 28 PHP
让PHP支持断点续传的源码
May 16 PHP
php开启安全模式后禁用的函数集合
Jun 26 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
Yii列表定义与使用分页方法小结(3种方法)
Jul 15 PHP
PHP版单点登陆实现方案的实例
Nov 17 PHP
thinkPHP5.0框架模块设计详解
Mar 18 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
关于PHP中协程和阻塞的一些理解与思考
Aug 11 PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 PHP
php中上传文件的的解决方案
Sep 25 #PHP
PHP调用微博接口实现微博登录的方法示例
Sep 22 #PHP
PHP如何搭建百度Ueditor富文本编辑器
Sep 21 #PHP
详解php协程知识点
Sep 21 #PHP
在php的yii2框架中整合hbase库的方法
Sep 20 #PHP
php实现在线考试系统【附源码】
Sep 18 #PHP
PHP htmlspecialchars() 函数实例代码及用法大全
Sep 18 #PHP
You might like
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
基于jQuery的倒计时插件代码
2011/05/07 Javascript
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
js判断日期时间有效性的方法
2015/10/24 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
Python入门篇之函数
2014/10/20 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
关于python的缩进规则的知识点详解
2020/06/22 Python
浅析python函数式编程
2020/09/26 Python
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
个人职业生涯规划书1500字
2013/12/31 职场文书
学生操行评语大全
2014/04/24 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
python基础之while循环语句的使用
2021/04/20 Python
JS Object构造函数之Object.freeze
2021/04/28 Javascript
Python中的pprint模块
2021/11/27 Python
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android