多个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 转换字符串编码 iconv与mb_convert_encoding的区别说明
Nov 10 PHP
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
Dec 25 PHP
PHP面向对象法则
Feb 23 PHP
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
Jun 06 PHP
深入解析PHP内存管理之谁动了我的内存
Jun 20 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
thinkPHP实现瀑布流的方法
Nov 29 PHP
实例讲解PHP设计模式编程中的简单工厂模式
Feb 29 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
Oct 11 PHP
Laravel如何同时连接多个数据库详解
Aug 13 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
php 特殊字符处理函数
2008/09/05 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
JS 有名函数表达式全面解析
2010/03/19 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
2015/03/03 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
2017/05/19 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
python命令行参数用法实例分析
2019/06/25 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
python程序 创建多线程过程详解
2019/09/23 Python
python sorted方法和列表使用解析
2019/11/18 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
美德好少年事迹材料
2014/01/19 职场文书
教职工代表大会主持词
2014/04/01 职场文书
项目建议书范文
2014/05/12 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
python opencv人脸识别考勤系统的完整源码
2021/04/26 Python
python3 字符串str和bytes相互转换
2022/03/23 Python