多个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+xslt在windows平台上
Oct 09 PHP
在字符串中把网址改成超级链接
Oct 09 PHP
基于mysql的论坛(3)
Oct 09 PHP
AJAX for PHP简单表数据查询实例
Jan 02 PHP
php处理斐波那契数列非递归方法
Feb 04 PHP
php地址引用(php地址引用的效率问题)
Mar 23 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
Mar 12 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 PHP
php实现登录页面的简单实例
Sep 29 PHP
php生成HTML文件的类方法
Oct 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一些服务器端特性的配置加强php的安全
2006/10/09 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
基于react组件之间的参数传递(详解)
2017/09/05 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
Python重新引入被覆盖的自带function
2014/07/16 Python
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
对于Python装饰器使用的一些建议
2015/06/03 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
谈谈python中GUI的选择
2018/03/01 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
使用pip安装python库的多种方式
2019/07/31 Python
python 实现矩阵按对角线打印
2019/11/29 Python
自我鉴定四大框架
2014/01/17 职场文书
服装创业计划书范文
2014/02/05 职场文书
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
倡议书范文格式
2014/05/12 职场文书
电影复兴之路观后感
2015/06/02 职场文书
刑事法律意见书
2015/06/04 职场文书
Elasticsearch 配置详解
2022/04/19 Java/Android