多个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下通过POST还是GET来传值
Jun 05 PHP
php zlib压缩和解压缩swf文件的代码
Dec 30 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
PHP关联数组的10个操作技巧
Jan 21 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
PHPThumb图片处理实例
May 03 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
Dec 16 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 PHP
php str_replace替换指定次数的方法详解
May 05 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
PHP7基于curl实现的上传图片功能
May 11 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
用PHP+MySql编写聊天室
2006/10/09 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
PHP时间和日期函数详解
2015/05/08 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
js闭包学习心得总结
2018/04/17 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
python Django连接MySQL数据库做增删改查
2013/11/07 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
python实现五子棋游戏(pygame版)
2020/01/19 Python
Python urllib3软件包的使用说明
2020/11/18 Python
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
Java程序员面试90题
2013/10/19 面试题
数控技术专业推荐信
2013/11/01 职场文书
产品质量承诺书范文
2014/03/27 职场文书
媒体宣传策划方案
2014/05/25 职场文书
大专生自荐书范文
2014/06/22 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
详解nginx进程锁的实现
2021/06/14 Servers
html5实现点击弹出图片功能
2021/07/16 HTML / CSS