多个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原创论坛
Oct 09 PHP
PHP无刷新上传文件实现代码
Sep 19 PHP
浅析PHP页面局部刷新功能的实现小结
Jun 21 PHP
YII实现分页的方法
Jul 09 PHP
PHP开发框架Laravel数据库操作方法总结
Sep 03 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
php实现字符串翻转的方法
Mar 27 PHP
利用ajax和PHP实现简单的流程管理
Mar 23 PHP
PHP中时间加减函数strtotime用法分析
Apr 26 PHP
PHP数据库操作二:memcache用法分析
Aug 16 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
JS 实现双色表格实现代码
2009/11/24 Javascript
jquery foreach使用示例
2013/09/12 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
python魔法方法-自定义序列详解
2016/07/21 Python
python机器学习之决策树分类详解
2017/12/20 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
浅析Python3 pip换源问题
2020/01/06 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
红领巾心向党广播稿
2014/01/19 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
国际贸易求职信
2014/07/05 职场文书
工作检讨书范文
2015/01/23 职场文书
医生个人年终总结
2015/02/28 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
关于python类SortedList详解
2021/09/04 Python
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle