当前位置:首页 > CMS教程 > 其它CMS > 列表

多个Laravel项目如何共用migrations详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-30 11:38:16 浏览: 评论:0 

这篇文章主要给大家介绍了关于多个Laravel项目如何共用migrations的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

前言

在实际开发中,我们可能经常会遇到一个项目会建立两个 Laravel 项目,一个是面向用户的 web/API,一个是管理员后台,这两个项目一般情况下是共用一个数据库的,那么我们的 migration 可以共用吗?该怎么操作?

Migration就相当于数据库的版本控制工具,可以使用

php artisan migration

生成数据库表,但前提是要在database目录下有相应的表的PHP文件

下面话不多说了,来一起看看详细的介绍吧

在各项目里建各自 migration

我们先在 web/API 和 admin 里都建各自的 migration:

  1. ## web 目录 
  2.  
  3. php artisan make:migration foo 
  4. # Created Migration: 2018_09_19_144940_foo 
  5.  
  6. php artisan migrate 
  7. # Migration table created successfully. 
  8. # Migrating: 2018_09_19_144940_foo 
  9. # Migrated: 2018_09_19_144940_foo 
  10.  
  11. php artisan migrate:status 
  12. # +------+-----------------------+-------+ 
  13. # | Ran? | Migration    | Batch | 
  14. # +------+-----------------------+-------+ 
  15. # | Yes | 2018_09_19_144940_foo | 1  | 
  16. # +------+-----------------------+-------+ 
  17.  
  18. ## admin 目录 
  19.  
  20. php artisan make:migration bar 
  21. # Created Migration: 2018_09_19_145255_bar 
  22.  
  23. php artisan migrate 
  24. # Migrating: 2018_09_19_145255_bar 
  25. # Migrated: 2018_09_19_145255_bar 
  26.  
  27. php artisan migrate:status 
  28. # +------+-----------------------+-------+ 
  29. # | Ran? | Migration    | Batch | 
  30. # +------+-----------------------+-------+ 
  31. # | Yes | 2018_09_19_144940_foo | 1  | 
  32. # +------+-----------------------+-------+ 
  33. # | Yes | 2018_09_19_145255_bar | 2  | 
  34. # +------+-----------------------+-------+ 

从 artisan migrate:status 的结果来看,两个 migration 都正常执行了,接下来我们试一下回滚操作。

先直接在 web 目录执行

php artisan migrate:rollback

# Migration not found: 2018_09_19_145255_bar

报错了,因为在 web 项目里找不到 bar 这个 migration 文件;那如果我们刚刚是直接在 admin 目录执行,是能够正常回滚的,但是如果我们指定回滚两个版本:

  1. php artisan migrate:rollback --step=2 
  2.  
  3. # Migration not found: 2018_09_19_144940_foo 
  4. # Rolling back: 2018_09_19_145255_bar 
  5. # 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 放在同一个地方,怎么操作呢?再建一个新的项目似乎有点麻烦了...我们先看看帮助吧:

  1. php artisan migrate --help 
  2.  
  3. Description: 
  4.  Run the database migrations 
  5.  
  6. Usage: 
  7.  migrate [options] 
  8.  
  9. Options: 
  10.   --database[=DATABASE] The database connection to use 
  11.   --force    Force the operation to run when in production 
  12.   --path[=PATH]   The path to the migrations files to be executed 
  13.   --realpath    Indicate any provided migration file paths are pre-resolved absolute paths 
  14.   --pretend    Dump the SQL queries that would be run 
  15.   --seed     Indicates if the seed task should be re-run 
  16.   --step     Force the migrations to be run so they can be rolled back individually 
  17.  -h, --help     Display this help message 
  18.  -q, --quiet    Do not output any message 
  19.  -V, --version    Display this application version 
  20.   --ansi     Force ANSI output 
  21.   --no-ansi    Disable ANSI output 
  22.  -n, --no-interaction  Do not ask any interactive question 
  23.   --env[=ENV]   The environment the command should run under 
  24.  -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 了:

  1. php artisan make:migration foo --path="../admin/database/migrations" 
  2.  
  3. or 
  4.  
  5. php artisan make:migration foo --path="/the/absolute_path/to/admin/database/migrations" --realpath 
  6.  
  7.  
  8. # migrate 
  9. php artisan migrate --path="../admin/database/migrations" 
  10.  
  11. # migrate:rollback 
  12. php artisan migrate:rollback --path="../admin/database/migrations" 

注:当你不带 --realpath 的时候,path 是以项目的根目录为 / 的

总结

所以,当我们需要在多个 Laravel 项目中共用 migrations 的时候,最好的做法是通过 --path 指定 migrations 文件的目录,这个目录可以是一个独立的 git repo,也可以是其中一个 Laravel 项目(我个人推荐放在其中一个项目中,采用独立的 git 分支),这样既可以共用 migrations,在团队协作的时候也不会混乱和出现冲突

Tags: Laravel migrations

分享到: