多个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 相关文章推荐
一个用mysql_odbc和php写的serach数据库程序
Oct 09 PHP
PHP缓存技术的使用说明
Aug 06 PHP
解析php取整的几种方式
Jun 25 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
PHP比较运算符的详细介绍
Sep 29 PHP
php实现概率性随机抽奖代码
Jan 02 PHP
使用php实现从身份证中提取生日
May 09 PHP
Yii2实现上下联动下拉框功能的方法
Aug 10 PHP
laravel框架之数据库查出来的对象实现转化为数组
Oct 23 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 PHP
PHP网页缓存技术优点及代码实例
Jul 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
PHP扩展编写点滴 技巧收集
2010/03/09 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
js中if语句的几种优化代码写法
2011/03/12 Javascript
jquery插件NProgress.js制作网页加载进度条
2015/06/05 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
有趣的python小程序分享
2017/12/05 Python
Python扩展内置类型详解
2018/03/26 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
Python的形参和实参使用方式
2019/12/24 Python
python GUI计算器的实现
2020/10/09 Python
python利用faker库批量生成测试数据
2020/10/15 Python
python palywright库基本使用
2021/01/21 Python
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
加工操作管理制度
2014/01/19 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
大学生个人自荐信
2014/02/24 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python