Laravel同時使用MySQL與MongoDB
相關連結
https://hackmd.io/@SuFrank/BJOe3Fi3c#docker-compose%E8%85%B3%E6%9C%AC
安裝與啟動MongoDB
在docker的環境下非常容易,如下yml
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  | 
						version: "3.3" services:   mongo:     container_name: mongo     image: mongo:7.0.12     platform: linux/arm64     restart: unless-stopped     environment:       - MONGO_INITDB_ROOT_USERNAME=admin       - MONGO_INITDB_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}     ports:       - 27017:27017     volumes:       - mongo-data:/data/db     networks:       - dev networks:   dev: volumes:   mongo-data:  | 
					
說明一下項目
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,增加下面這一行
| 
					 1  | 
						RUN pecl install mongodb  | 
					
重新build image後在php.ini中加入以下,用來打開extention
| 
					 1  | 
						extension=mongodb.so  | 
					
在專案中安裝相關套件
回到專案的根目錄下使用以下指令安裝
| 
					 1  | 
						composer require mongodb/laravel-mongodb:^4.7  | 
					
配置env與其他設定檔
在config/app.php中增加
| 
					 1 2 3 4 5  | 
						'providers' => ServiceProvider::defaultProviders()->merge([ ... MongoDB\Laravel\MongoDBServiceProvider::class, ... ])->toArray(),  | 
					
在config/database.php中增加
| 
					 1 2 3 4 5 6 7 8 9  | 
						'connections' => [ ... 'mongodb' => [             'driver' => 'mongodb',             'dsn' => env('MONGO_DB_URI'),             'database' => env('MONGO_DB_DATABASE', 'forge'), ] ... ]  | 
					
這樣做可以把連線資訊(dsn)與要連結的資料庫(database)都改由env檔案提供資訊
在env檔案中增加
| 
					 1 2  | 
						MONGO_DB_URI=mongodb://USER:PASSWORD@LOCATION MONGO_DB_DATABASE=USE_DB_NAME  | 
					
說明如下
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
| 
					 1  | 
						php artisan maek:model department  | 
					
這裡使用一個範例建立department model用來存取mongoDB中的department collection
接著編輯department model
| 
					 1 2 3 4  | 
						將 use Illuminate\Database\Eloquent\Model; 替換成 use MongoDB\Laravel\Eloquent\Model;  | 
					
完成範例如下
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13  | 
						namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class department extends Model {     protected $connection = 'mongodb';     protected $fillable = [         'name',         'location',         'manager_name'     ]; }  | 
					
我們需要將$connection指定到mongodb,以及先定義好需要用到的collection key在$fillable中,用法就如同MySQL中的欄位
接下來的用法就與原本使用model存取MySQL資料庫相同了,提供幾個範例如下
範例
1.寫入一筆資料
| 
					 1 2 3 4 5  | 
						department::create([     'name' => '人力資源部',     'location' => '台北市辦公室本部',     'manager_name' => '艾利爾' ]);  | 
					
2. 取得location = ‘台北市辦公室本部’的list
| 
					 1  | 
						$departments = department::where('location','台北市辦公室本部')->get();  |