Laravel 配置使用 MongoDB 資料庫

更新於 2024/10/14閱讀時間約 10 分鐘

為了做登入log紀錄,練習mongoDB來存放log資料,這邊就來紀錄 Laravel 配置mongoDB的實作,而原本我的side project是練習搭建docker開發環境,故這邊會以dockerfile來設定跟紀錄踩坑問題。

關於MongoDB?

MongoDB是一個開源的NoSQL(非關聯型)數據庫管理系統,通常縮寫為Mongo。它以橫向擴展能力、靈活的數據模型和高性能而聞名,特別適合處理大量的非結構化或半結構化數據,基本的MongoDB特點,可以透過ChatGPT解釋幫助理解。

總體來說,MongoDB是一個多用途、高性能的數據庫系統,特別適合處理大量的非結構化或半結構化數據,並且在Web應用程序、移動應用程序、物聯網和大數據等領域中廣泛應用。它的簡單語法和靈活性使開發人員能夠迅速開發應用程序,而且它可以根據應用程序的需求輕松擴展。

設定Mongo

接下來要來配置Mongo,這邊會使用官方建議套件mongodb/laravel-mongodb來實作,而在安裝前根據說明文件,需要先安裝 MongoDB PHP 擴展的支持,如果是使用docker容器的話,就要額外編寫dockerfile增加安裝 MongoDB PHP 擴展及mongoDB image,並在config/database.php增加mongo設定檔。

首先先修正docker-compose.yml,增加mongo的設定

raw-image

接著根據說明文件規定,安裝 MongoDB PHP 擴展的支持,編寫dockerfile

//安裝 MongoDB PHP 擴展
RUN pecl install mongodb
RUN docker-php-ext-enable mongodb

接著測試連接mongo容器,確認mongo有設定成功。

​docker exec -it {your_container_name} bash

接著進到mongo shell 新增DB跟insert一筆資料看看結果,而當你mongo版本太高,輸入 mongo會遇到以下狀況,這邊可以參考這篇文章解決方案以mongosh進入,如果要查看image版本,可以輸入下列指令。

raw-image
// 查看image 版本
docker images mongo
// 進入mongo shell​ with db 帳號密碼
mongosh --host localhost:27017 -u {your_account} -p

正確進入後會看到這個畫面,接著我們可以使用下列指令新增DB跟資料

raw-image
//切換db or create new db
use tests

//塞入一筆資料
db.posts.insertOne({
title: "Post Title 1",
body: "Body of post.",
category: "News",
likes: 1,
tags: ["news", "events"],
date: Date()
})
raw-image

確認mongo GUI工具,有正常看到此筆新增資料

raw-image

設置 Laravel

這邊使用mongodb/laravel-mongodb 套件安裝,並配置相關Laravel設定,先執行composer 安裝指令。

composer require mongodb/laravel-mongodb

安裝完畢且確定容器mongo都能正常執行資料,接下來要開始設定DB與Laravel專案連接,首先先配置database.php及環境變數.env的設定。

MONGO_HOST=app_mongodb
MONGO_DATABASE=demo
MONGO_USERNAME=test
MONGO_PASSWORD=password
raw-image

創建Mongo migration table,創建完畢後需要使用mongodb/laravel-mongodb套件功能來幫助我們新增table欄位,且透過createAt設定ttl索引。

註:根據 MongoDB 6.3 開始,MongoDB 可以使用TTL 索引,它在一段時間後或在特定時鐘時間自動從集合中刪除文件,詳細可查看相關文檔

php artisan make:migration create_collection_log_record
raw-image

這時候創建完執行migrate會出現以下問題

The SCRAM_SHA_256 authentication mechanism requires libmongoc built with ENABLE_SSL

這問題主要是建置時未完整安裝 SSL 函式庫(例如libssl-dev),這邊可以透過以下指令來查看擴展

php -i | grep -i mongo

這是缺乏擴展

root@8dbdb24198c7:/var/www/html# php -i | grep -i mongo
/usr/local/etc/php/conf.d/docker-php-ext-mongodb.ini,
mongodb
MongoDB support => enabled
MongoDB extension version => 1.16.2
MongoDB extension stability => stable
libmongoc bundled version => 1.24.3
libmongoc SSL => disabled
libmongoc crypto => disabled
libmongoc SASL => disabled
libmongoc ICU => disabled
libmongoc compression => enabled
libmongoc compression snappy => disabled
libmongoc compression zlib => enabled
libmongoc compression zstd => disabled
libmongocrypt => disabled
mongodb.debug => no value => no value

這是補全libssl-dev擴展

root@104e5e4e238e:/var/www/html# php -i | grep -i mongo
/usr/local/etc/php/conf.d/docker-php-ext-mongodb.ini,
mongodb
MongoDB support => enabled
MongoDB extension version => 1.16.2
MongoDB extension stability => stable
libmongoc bundled version => 1.24.3
libmongoc SSL => enabled
libmongoc SSL library => OpenSSL
libmongoc crypto => enabled
libmongoc crypto library => libcrypto
libmongoc crypto system profile => disabled
libmongoc SASL => disabled
libmongoc ICU => disabled
libmongoc compression => enabled
libmongoc compression snappy => disabled
libmongoc compression zlib => enabled
libmongoc compression zstd => disabled
libmongocrypt bundled version => 1.8.1
libmongocrypt crypto => enabled
libmongocrypt crypto library => libcrypto
mongodb.debug => no value => no value

接著我們要在dockerfile增加額外擴展,以便可以順利創建migrate,增加以下條件後,需要重新build docker

RUN apt-get install -y libmongoc-1.0-0 libssl-dev

執行migrate,確定laravel對於資料庫連接都正常執行了

raw-image
raw-image

實作邏輯

接著要來設定Model 並且撰寫登入log紀錄的儲存,確認執行正常,創建Model並配置相關設定,正常是編寫一個專門用來記錄logger的Service,但這邊求快,先寫在登入邏輯裡

php artisan make:model LogRecord
raw-image

在登入功能裡增加log紀錄,接著測試操作執行確認資料有正常寫入mongoDB

raw-image
raw-image

以上是整個配置流程及踩到的坑,比較麻煩的部分大概就是php版本對應的mongo版本的擴展比較容易有衝突,最後附上查詢相關文件連結。


Set Up to Run PHP with MongoDB

https://stackoverflow.com/questions/58680158/install-mongodb-driver-in-docker-with-dockerfile

mongodb.installation.pecl.php

https://github.com/doctrine/DoctrineMongoDBBundle/issues/450

https://github.com/docker-library/php/issues/374

https://stackoverflow.com/questions/49894623/why-docker-php-ext-install-does-not-contains-some-extensions-and-has-it-advanta



avatar-img
15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
DDDDD的沙龍 的其他內容
最近剛好分配一個需求,要批次更新一些基礎設定資料,而新系統基礎設定資料都統一由別的團隊維護在Google Sheet 上,一開始是要我寫 Laravel Seeder 塞資料表,後來發現也太多數據要批次更新了,數據要對到何時何年,乾脆來研究串 Google Sheet API 整批塞入在對總行數就好
在撰寫專案時,有時候可能需要做一些特定Exceptions 來拋出error message的情況,而在不同公司任職,大家配置的流程可能就有些不同,這邊將簡單練習如何配置自定義的Exception。
作為一個純後端,不會前端也是正常的事(誤),但該練習的技能線還是得每天練習一點,尤其我是一個前端小廢物,那既然要用Laravel 9 版本來做開發,那就得先試試看vite這個新的工具,基本上這邊就簡單介紹使用方式,另一篇在額外說明Laravel Mix 與 Vite 差別。
最近在開發某一個項目功能,這也是先前同事踩到的坑,這次換我在踩一次,順便記錄一下,主要發生情境是,在執行GET參數,定義一個isDownlineSearch 布林判斷時,前端傳入true or false,在執行以下程式碼判斷時會失敗,他無法正確判斷此值。
最近因為想要花些時間做完一個完整的SideProject,以前總是懂得怎麼使用,拼拼湊湊完成一個塞趴卷就交卷了,但都沒時間去真正理解這些原理的應用,而Laravel 框架本身支持的登入登出的工具,就有好多種。
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
最近剛好分配一個需求,要批次更新一些基礎設定資料,而新系統基礎設定資料都統一由別的團隊維護在Google Sheet 上,一開始是要我寫 Laravel Seeder 塞資料表,後來發現也太多數據要批次更新了,數據要對到何時何年,乾脆來研究串 Google Sheet API 整批塞入在對總行數就好
在撰寫專案時,有時候可能需要做一些特定Exceptions 來拋出error message的情況,而在不同公司任職,大家配置的流程可能就有些不同,這邊將簡單練習如何配置自定義的Exception。
作為一個純後端,不會前端也是正常的事(誤),但該練習的技能線還是得每天練習一點,尤其我是一個前端小廢物,那既然要用Laravel 9 版本來做開發,那就得先試試看vite這個新的工具,基本上這邊就簡單介紹使用方式,另一篇在額外說明Laravel Mix 與 Vite 差別。
最近在開發某一個項目功能,這也是先前同事踩到的坑,這次換我在踩一次,順便記錄一下,主要發生情境是,在執行GET參數,定義一個isDownlineSearch 布林判斷時,前端傳入true or false,在執行以下程式碼判斷時會失敗,他無法正確判斷此值。
最近因為想要花些時間做完一個完整的SideProject,以前總是懂得怎麼使用,拼拼湊湊完成一個塞趴卷就交卷了,但都沒時間去真正理解這些原理的應用,而Laravel 框架本身支持的登入登出的工具,就有好多種。
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
在專案開發的時候,專案架構搭建時團隊就會設定 php code style 檢查,避免整個開發團隊大家走出自己的風格,尤其是兩格空白還是四格空白,總是會有不同意見,這時候定義出團隊code style,並透過配置Github Action CI(Continuous Integration)
Thumbnail
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
Thumbnail
本篇深入探討了Model的基本定義、其Controller的關係,以及如何在Controller中使用Model進行CRUD操作。強調了Model的關聯方法,如hasMany,並透過範例程式碼展示了其實際應用。為初學者提供了一個清晰的Laravel入門路徑,同時也為有經驗的開發者提供了實用的參考。
Thumbnail
Laravel的Model是資料和邏輯的核心連接,簡化資料庫操作。本指南著重於Model的基本屬性、方法和Eloquent ORM的使用。我們詳細探討了hasMany、hasOne和belongsTo這些關聯,它們基於外鍵確定資料間的關係。透過本文,您將深入了解如何有效地在Laravel中使用Mod
Thumbnail
1. 使用composer安裝 2. publish the configuration 在config資料夾中會多出一個google-calendar.php 3. 取得Google API credentials (1) 到Google Cloud Platform頁面,選擇專案。 後記:
Thumbnail
假設資料如下: local DB裡面的test Collection SELECT SELECT可以這樣寫: 由於config/database.php中設定的default DB_CONNECTION是mysql,所以這邊特別指定使用mongodb connection。 回傳結果如下: 軟刪除
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
在專案開發的時候,專案架構搭建時團隊就會設定 php code style 檢查,避免整個開發團隊大家走出自己的風格,尤其是兩格空白還是四格空白,總是會有不同意見,這時候定義出團隊code style,並透過配置Github Action CI(Continuous Integration)
Thumbnail
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
Thumbnail
本篇深入探討了Model的基本定義、其Controller的關係,以及如何在Controller中使用Model進行CRUD操作。強調了Model的關聯方法,如hasMany,並透過範例程式碼展示了其實際應用。為初學者提供了一個清晰的Laravel入門路徑,同時也為有經驗的開發者提供了實用的參考。
Thumbnail
Laravel的Model是資料和邏輯的核心連接,簡化資料庫操作。本指南著重於Model的基本屬性、方法和Eloquent ORM的使用。我們詳細探討了hasMany、hasOne和belongsTo這些關聯,它們基於外鍵確定資料間的關係。透過本文,您將深入了解如何有效地在Laravel中使用Mod
Thumbnail
1. 使用composer安裝 2. publish the configuration 在config資料夾中會多出一個google-calendar.php 3. 取得Google API credentials (1) 到Google Cloud Platform頁面,選擇專案。 後記:
Thumbnail
假設資料如下: local DB裡面的test Collection SELECT SELECT可以這樣寫: 由於config/database.php中設定的default DB_CONNECTION是mysql,所以這邊特別指定使用mongodb connection。 回傳結果如下: 軟刪除