前言
在实际开发中,我们可能经常会遇到一个项目会建立两个 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_foophp artisan migrate# Migration table created successfully.# Migrating: 2018_09_19_144940_foo# Migrated: 2018_09_19_144940_foophp 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_barphp artisan migrate# Migrating: 2018_09_19_145255_bar# Migrated: 2018_09_19_145255_barphp 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 方法。
新闻热点
疑难解答