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(); |