Laravel同時使用MySQL與MongoDB

相關連結

https://hackmd.io/@SuFrank/BJOe3Fi3c#docker-compose%E8%85%B3%E6%9C%AC

https://medium.com/kidd88/laravel-%E5%90%8C%E6%99%82%E4%BD%BF%E7%94%A8mongodb%E8%88%87mysql-19d0c8ca4604

安裝與啟動MongoDB

在docker的環境下非常容易,如下yml

說明一下項目

1.因為開發機是Mac M1 CPU因此在platform上選擇使用linux/arm64版本

各位可以因應自己機器架構、作業系統而選則不同的image或者platform,可以參考MongoDB的dockerHub

2.在environment中提供mongoDB所要使用的帳號與密碼,這邊我把密碼存放在env中,與MySQL使用同一組密碼

3.mongoDB預設使用27017 port,也可以自由變更本地端對應的port

4.提供一個volumn,mongo-data 作為資料持久話儲存的媒介

container起來之後就可以用localhost:27017來存取mongoDB或者在同一個network中的其他container直接使用service name: mongo來存取

 

PHP執行環境安裝mongoDB相關套件

在docker環境中,我們編輯 PHP的Dockerfile,增加下面這一行

重新build image後在php.ini中加入以下,用來打開extention

 

在專案中安裝相關套件

回到專案的根目錄下使用以下指令安裝

 

配置env與其他設定檔

在config/app.php中增加

在config/database.php中增加

這樣做可以把連線資訊(dsn)與要連結的資料庫(database)都改由env檔案提供資訊

在env檔案中增加

說明如下

1.MONGO_DB_URI 中的USER 與 PASSWORD就是上方docker containter建構時提供的帳號密碼

2.MONGO_DB_URI 中的LOCATION可以替換成mongoDB的所在位置,如果依照上面的docker範例,可以是本地端IP或者直接用service name,mongo就行

3.MONGO_DB_DATA_BASE可以自由只定要用的database,跟原本在MySQL的環境中需要先建立DB與tabel的概念不同

 

建立Model來對mongoDB中的collection做存取

這裡的collection指的是mongoDB中的collection,就是MySQL中table的概念

我們可以用artisan指令建立model

這裡使用一個範例建立department model用來存取mongoDB中的department collection

接著編輯department model

完成範例如下

我們需要將$connection指定到mongodb,以及先定義好需要用到的collection key在$fillable中,用法就如同MySQL中的欄位

接下來的用法就與原本使用model存取MySQL資料庫相同了,提供幾個範例如下

 

範例

1.寫入一筆資料

2. 取得location = ‘台北市辦公室本部’的list