多个Laravel项目如何共用migrations详解
前言
在实际开发中,我们可能经常会遇到一个项目会建立两个Laravel项目,一个是面向用户的web/API,一个是管理员后台,这两个项目一般情况下是共用一个数据库的,那么我们的migration可以共用吗?该怎么操作?
Migration就相当于数据库的版本控制工具,可以使用
phpartisanmigration
生成数据库表,但前提是要在database目录下有相应的表的PHP文件
下面话不多说了,来一起看看详细的介绍吧
在各项目里建各自migration
我们先在web/API和admin里都建各自的migration:
##web目录 phpartisanmake:migrationfoo #CreatedMigration:2018_09_19_144940_foo phpartisanmigrate #Migrationtablecreatedsuccessfully. #Migrating:2018_09_19_144940_foo #Migrated:2018_09_19_144940_foo phpartisanmigrate:status #+------+-----------------------+-------+ #|Ran?|Migration|Batch| #+------+-----------------------+-------+ #|Yes|2018_09_19_144940_foo|1| #+------+-----------------------+-------+ ##admin目录 phpartisanmake:migrationbar #CreatedMigration:2018_09_19_145255_bar phpartisanmigrate #Migrating:2018_09_19_145255_bar #Migrated:2018_09_19_145255_bar phpartisanmigrate:status #+------+-----------------------+-------+ #|Ran?|Migration|Batch| #+------+-----------------------+-------+ #|Yes|2018_09_19_144940_foo|1| #+------+-----------------------+-------+ #|Yes|2018_09_19_145255_bar|2| #+------+-----------------------+-------+
从artisanmigrate:status的结果来看,两个migration都正常执行了,接下来我们试一下回滚操作。
先直接在web目录执行
phpartisanmigrate:rollback #Migrationnotfound:2018_09_19_145255_bar
报错了,因为在web项目里找不到bar这个migration文件;那如果我们刚刚是直接在admin目录执行,是能够正常回滚的,但是如果我们指定回滚两个版本:
phpartisanmigrate:rollback--step=2 #Migrationnotfound:2018_09_19_144940_foo #Rollingback:2018_09_19_145255_bar #Rolledback:2018_09_19_145255_bar
这次回滚操作也是有问题的,只回滚了一半。
所以我们应该按照migrate的相反顺序执行回滚,即先在admin执行一次,然后再到web里再执行一次。我们上面的实验很简单,要记住这些顺序也不难,可是在实际的项目中,你的migrations就比这个复杂多了,而且只通过migrate:status你也看不出来执行顺序到底是怎么样的,所以在各个项目里各自维护各自的migrations似乎行不通...
共用一份migration
上面的实验我们可以知道,我们在执行artisanmigrate的时候,Laravel会读取migrations目录里的文件和数据库里的记录,然后再执行相应的操作(并记录这次操作);回滚的时候Laravel会读取数据库中的记录,然后执行migrations目录里相应的文件中的down方法。
而当migrations分散在不同的项目(目录)里的时候,不管你在哪个项目中执行migrate:rollback时,都可能只有一部分migration文件被加载进来,因此会造成一些奇奇怪怪的问题。
那我们可以将所有migrations放在同一个地方,怎么操作呢?再建一个新的项目似乎有点麻烦了...我们先看看帮助吧:
phpartisanmigrate--help Description: Runthedatabasemigrations Usage: migrate[options] Options: --database[=DATABASE]Thedatabaseconnectiontouse --forceForcetheoperationtorunwheninproduction --path[=PATH]Thepathtothemigrationsfilestobeexecuted --realpathIndicateanyprovidedmigrationfilepathsarepre-resolvedabsolutepaths --pretendDumptheSQLqueriesthatwouldberun --seedIndicatesiftheseedtaskshouldbere-run --stepForcethemigrationstoberunsotheycanberolledbackindividually -h,--helpDisplaythishelpmessage -q,--quietDonotoutputanymessage -V,--versionDisplaythisapplicationversion --ansiForceANSIoutput --no-ansiDisableANSIoutput -n,--no-interactionDonotaskanyinteractivequestion --env[=ENV]Theenvironmentthecommandshouldrununder -v|vv|vvv,--verboseIncreasetheverbosityofmessages:1fornormaloutput,2formoreverboseoutputand3fordebug
果然有我们想要的东西:--path和--realpath,先来看看这两个参数是什么用途:
--path[=PATH] 指定migrations文件的路径
--realpath 表示--path指定的路径为绝对路径
那我们在进行migrations操作的时候,指定同一个路径,那就可以共用migrations了:
phpartisanmake:migrationfoo--path="../admin/database/migrations" #or phpartisanmake:migrationfoo--path="/the/absolute_path/to/admin/database/migrations"--realpath #migrate phpartisanmigrate--path="../admin/database/migrations" #migrate:rollback phpartisanmigrate:rollback--path="../admin/database/migrations"
注:当你不带--realpath的时候,path是以项目的根目录为/的
总结
所以,当我们需要在多个Laravel项目中共用migrations的时候,最好的做法是通过--path指定migrations文件的目录,这个目录可以是一个独立的gitrepo,也可以是其中一个Laravel项目(我个人推荐放在其中一个项目中,采用独立的git分支),这样既可以共用migrations,在团队协作的时候也不会混乱和出现冲突
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。