多個(gè)Laravel項(xiàng)目如何共用migrations詳解
前言
在實(shí)際開(kāi)發(fā)中,我們可能經(jīng)常會(huì)遇到一個(gè)項(xiàng)目會(huì)建立兩個(gè) Laravel 項(xiàng)目,一個(gè)是面向用戶的 web/API,一個(gè)是管理員后臺(tái),這兩個(gè)項(xiàng)目一般情況下是共用一個(gè)數(shù)據(jù)庫(kù)的,那么我們的 migration 可以共用嗎?該怎么操作?
Migration就相當(dāng)于數(shù)據(jù)庫(kù)的版本控制工具,可以使用
php artisan migration
生成數(shù)據(jù)庫(kù)表,但前提是要在database目錄下有相應(yīng)的表的PHP文件
下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
在各項(xiàng)目里建各自 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 的結(jié)果來(lái)看,兩個(gè) migration 都正常執(zhí)行了,接下來(lái)我們?cè)囈幌禄貪L操作。
先直接在 web 目錄執(zhí)行
php artisan migrate:rollback # Migration not found: 2018_09_19_145255_bar
報(bào)錯(cuò)了,因?yàn)樵?web 項(xiàng)目里找不到 bar 這個(gè) migration 文件;那如果我們剛剛是直接在 admin 目錄執(zhí)行,是能夠正?;貪L的,但是如果我們指定回滾兩個(gè)版本:
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
這次回滾操作也是有問(wèn)題的,只回滾了一半。
所以我們應(yīng)該按照 migrate 的相反順序執(zhí)行回滾,即先在 admin 執(zhí)行一次,然后再到 web 里再執(zhí)行一次。我們上面的實(shí)驗(yàn)很簡(jiǎn)單,要記住這些順序也不難,可是在實(shí)際的項(xiàng)目中,你的 migrations 就比這個(gè)復(fù)雜多了,而且只通過(guò) migrate:status 你也看不出來(lái)執(zhí)行順序到底是怎么樣的,所以在各個(gè)項(xiàng)目里各自維護(hù)各自的 migrations 似乎行不通...
共用一份 migration
上面的實(shí)驗(yàn)我們可以知道,我們?cè)趫?zhí)行 artisan migrate 的時(shí)候,Laravel 會(huì)讀取 migrations 目錄里的文件和數(shù)據(jù)庫(kù)里的記錄,然后再執(zhí)行相應(yīng)的操作(并記錄這次操作);回滾的時(shí)候 Laravel 會(huì)讀取數(shù)據(jù)庫(kù)中的記錄,然后執(zhí)行 migrations 目錄里相應(yīng)的文件中的 down 方法。
而當(dāng) migrations 分散在不同的項(xiàng)目(目錄)里的時(shí)候,不管你在哪個(gè)項(xiàng)目中執(zhí)行 migrate:rollback
時(shí),都可能只有一部分 migration 文件被加載進(jìn)來(lái),因此會(huì)造成一些奇奇怪怪的問(wèn)題。
那我們可以將所有 migrations 放在同一個(gè)地方,怎么操作呢?再建一個(gè)新的項(xiàng)目似乎有點(diǎn)麻煩了...我們先看看幫助吧:
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,先來(lái)看看這兩個(gè)參數(shù)是什么用途:
--path[=PATH] 指定 migrations 文件的路徑
--realpath 表示 --path 指定的路徑為絕對(duì)路徑
那我們?cè)谶M(jìn)行 migrations 操作的時(shí)候,指定同一個(gè)路徑,那就可以共用 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"
注:當(dāng)你不帶 --realpath 的時(shí)候,path 是以項(xiàng)目的根目錄為 / 的
總結(jié)
所以,當(dāng)我們需要在多個(gè) Laravel 項(xiàng)目中共用 migrations 的時(shí)候,最好的做法是通過(guò) --path 指定 migrations 文件的目錄,這個(gè)目錄可以是一個(gè)獨(dú)立的 git repo,也可以是其中一個(gè) Laravel 項(xiàng)目(我個(gè)人推薦放在其中一個(gè)項(xiàng)目中,采用獨(dú)立的 git 分支),這樣既可以共用 migrations,在團(tuán)隊(duì)協(xié)作的時(shí)候也不會(huì)混亂和出現(xiàn)沖突
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
php 替換文章中的圖片路徑,下載圖片到本地服務(wù)器的方法
下面小編就為大家分享一篇php 替換文章中的圖片路徑,下載圖片到本地服務(wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Laravel 之url參數(shù),獲取路由參數(shù)的例子
今天小編就為大家分享一篇Laravel 之url參數(shù),獲取路由參數(shù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10PHP 將逗號(hào)、空格、回車分隔的字符串轉(zhuǎn)換為數(shù)組的函數(shù)
我們?cè)谒阉饕恍〇|西時(shí)會(huì)經(jīng)常遇到可以通過(guò)空格隔開(kāi)來(lái)達(dá)到輸入多個(gè)條件的目的。今天正好項(xiàng)目中遇到了這個(gè)情況,就寫了一個(gè)函數(shù),將多個(gè)條件放到數(shù)組里2012-06-06Laravel使用Caching緩存數(shù)據(jù)減輕數(shù)據(jù)庫(kù)查詢壓力的方法
這篇文章主要介紹了Laravel使用Caching緩存數(shù)據(jù)減輕數(shù)據(jù)庫(kù)查詢壓力的方法,以項(xiàng)目實(shí)例形式較為詳細(xì)的分析了Laravel框架使用Caching緩存的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03Codeigniter中mkdir創(chuàng)建目錄遇到權(quán)限問(wèn)題和解決方法
這篇文章主要介紹了Codeigniter中mkdir創(chuàng)建目錄遇到權(quán)限問(wèn)題和解決方法,需要的朋友可以參考下2014-07-07在Laravel 中實(shí)現(xiàn)是否關(guān)注的示例
今天小編就為大家分享一篇在Laravel 中實(shí)現(xiàn)是否關(guān)注的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10ThinkPHP5.0框架使用build 自動(dòng)生成模塊操作示例
這篇文章主要介紹了ThinkPHP5.0框架使用build 自動(dòng)生成模塊操作,結(jié)合實(shí)例形式分析了thinkPHP5使用build自動(dòng)生成模塊的具體步驟、方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-04-04