公告推出 MongoDB 8.0,史上最快的 MongoDB!阅读更多 >>推出 MongoDB 8.0,史上最快的 MongoDB!>>

MongoDB与Laravel集成

使用Atlas,在几分钟内将MongoDB连接到Laravel。

概述

Laravel是一个流行的PHP网络开发框架。它提供了许多默认设置,并提供了易于理解、快速使用的代码结构,用于实现网络应用程序和API。MongoDB有一个官方的Laravel集成,可在GitHub上找到。更多详细信息请参阅官方文档

在本教程中,我们将探讨如何使用Laravel和MongoDB构建网络应用程序和API。

目录

我可以在Laravel中使用MongoDB吗?

是的!实际上,MongoDB是Laravel项目的绝佳选择。随着我们开始使用MongoDB进行Laravel开发,我们将通过构建博客应用程序的示例来了解如何构建。

这里提供的安装命令已在MacOS上测试过,但如果你在Windows命令行或Linux机器上工作,不应遇到问题。你需要访问一个已经运行的MongoDB实例。

使用MongoDB Atlas的优势

在开发网络应用程序时,你不想花太多时间来设置和维护数据库。你的本地服务器也可能在存储数据方面资源有限。作为云服务的MongoDB Atlas——MongoDB提供的服务——是解决此问题的绝佳方案。你可以在Web控制台中创建你的集群和数据库,只需几分钟即可从你的Laravel应用程序连接到它。Atlas提供了一个免费层,让你开始使用Atlas体验。

设置本地Laravel开发环境

(你可以边看边编码,也可以从这个GitHub仓库下载完整代码。)

先决条件

由于Laravel是PHP框架,你需要在计算机上安装PHP。此步骤可能因操作系统而异。有关此步骤的更多详细信息,请参阅官方安装文档。在我们的演练中,你需要在计算机上安装PHP 7.4。

下一步是安装Composer。Composer是PHP的库和依赖管理器,允许你在项目中添加你想要使用的库。

安装Laravel项目

一旦安装了PHP和Composer,你就可以安装Laravel了。

在终端窗口中,输入以下命令

composer global require "laravel/installer"
export PATH=$PATH:$HOME/.composer/vendor/bin

要启动一个Laravel项目,运行以下命令。对于我们的项目,我们将使用 myapp 作为应用程序的名称

laravel new myapp

这将创建一个名为 myapp 的文件夹,其中包含初始的Laravel项目结构。

如果您从 myapp 文件夹运行以下命令,您应该会在 http://localhost:8000 上看到一个运行的Web应用程序和初始的Laravel页面

cd myapp
php artisan serve

安装Laravel MongoDB包

在我们可以安装Laravel的MongoDB库之前,我们需要安装MongoDB的PHP扩展。运行以下命令

sudo pecl install mongodb

您还需要确保在您的php.ini文件中启用了mongodb扩展。您的php.ini文件的位置将根据您的操作系统而有所不同。将以下行添加到您的php.ini文件中

extension="mongodb.so"

最后,从您的Laravel项目目录运行以下命令以添加Laravel的MongoDB包

composer require mongodb/laravel-mongodb

配置您的Laravel项目以使用MongoDB

配置MongoDB数据库

为了使Laravel能够与您的MongoDB数据库通信,您需要在Laravel项目的“config\database.php”文件中的“connections”对象下添加您的数据库连接信息,如下例所示

'connections' => [
  'mongodb' => [
        'driver' => 'mongodb',
        'dsn' => env('DB_URI', 'mongodb+srv://username:password@<atlas-cluster-uri>/myappdb?retryWrites=true&w=majority'),
        'database' => 'myappdb',
],

请确保包括正确的认证信息。

config\database.php 中设置默认数据库连接名称

   /*
    |--------------------------------------------------------------------------
| Default Database Connection Name
    |--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for all database work. Of course
| you may use many connections at once using the Database library.
|
    */

'default' => env('DB_CONNECTION', 'mongodb'),

定义服务提供者

如果您的Laravel项目没有自动加载依赖项,您可能还需要在 app.php 文件的服务提供者部分添加以下内容

'providers' => [

/*
* Laravel Framework Service Providers...
*/

MongoDB\Laravel\MongoDBServiceProvider::class,

Laravel MongoDB CRUD示例

Laravel的Eloquent库 允许我们从Laravel模型直接映射和执行数据库CRUD操作(创建、读取、更新、删除)。

假设我们有一个名为“posts”的MongoDB集合,"posts"集合中的一个示例文档可能如下所示

{ 
   "title":"First Blog Post",
   "body" :"Lorem Ipsum, etc.",
   "slug" :"first-blog-post"
}

如果您使用MongoDB Atlas,您可以使用 Atlas控制台 将此文档记录直接插入名为“myappdb”的数据库中。

创建模型、控制器、路由和视图文件

我们的第一步是创建一个Laravel模型来表示博客文章。从项目目录中,运行以下命令

php artisan make:model Post -mc

这将创建一个 App/Models/Post.php 和一个 App/Http/Controllers/PostController.php 文件。

默认情况下,Artisan创建的模型继承自 Illuminate\Database\Eloquent\Model。

但是,对于MongoDB,我们想要扩展MongoDB Eloquent模型,因此我们需要编辑 App/Models/Post.php。我们的Post模型应该如下所示

namespace App\Models;

use MongoDB\Laravel\Eloquent\Model;

class Post extends Model
{
   protected $connection = 'mongodb';

}

请注意,当存储新数据时,Laravel将自动为您在MongoDB数据库中创建集合。默认情况下,集合名称是所使用的模型的复数形式(在本例中是“posts”)。但是,您可以通过在模型上设置collection属性来覆盖它,如下所示

protected $collection = 'blog_posts';

如果您使用多个数据库,您还希望在上面的模型上指定数据库连接名称。

接下来,我们可以使用Post模型从MongoDB数据库中读取和显示我们的博客文章。首先,让我们在PostController中创建一个函数来获取使用slug的博客文章

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Post;

class PostController extends Controller
{
   public function show($slug)
   {
       return view('post', [
           'post' => Post::where('slug', '=', $slug)->first()
       ]);
   }

}

在上面的示例中,我们只是通过其slug名称检索文章。MongoDB Eloquent模型支持所有标准的Eloquent查询方法,但它们还支持特定于MongoDB自身的查询。有关更多详细信息,请参阅 https://github.com/mongodb/laravel-mongodb

接下来,让我们将以下行添加到routes\web.php文件中,为博客文章创建一个路由

Route::get('/post/{slug}', [PostController::class, 'show']);
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Route::get('/post/{slug}', [PostController::class, 'show']);

使用Laravel视图显示数据

最后,让我们添加一个视图来格式化和样式化博客文章数据以便显示。视图名称需要与我们在控制器中使用的视图名称匹配。我们可以通过创建文件 myapp/resources/views/post.blade.php 并包含以下内容来实现:

<!DOCTYPE html>
<html>
<head>
   <title>MyBlog</title>
</head>
<body>
   <h1>{{$post->title}}</h1>
   <div>{{$post->body}}</div>
</body>
</html>

现在我们可以在 http://localhost:8000/post/first-blog-post 上看到我们的文章。

将数据保存到MongoDB数据库

现在,假设你还想创建一个API,你可以用它来在应用程序中创建博客文章。首先,我们想在PostController中添加一个存储文章的方法

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Post;

class PostController extends Controller
{
   public function show($slug)
   {
       return view('post', [
           'post' => Post::where('slug', '=', $slug)->first()
       ]);
   }

   public function store(Request $request)
   {
       $post = new Post;

       $post->title = $request->title;
       $post->body = $request->body;
       $post->slug = $request->slug;

       $post->save();

       return response()->json(["result" => "ok"], 201);
   }

}

接下来,我们想在App\routes\api.php中为文章配置资源路由

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

use App\Http\Controllers\PostController;

Route::resource('posts', PostController::class)->only([
   'destroy', 'show', 'store', 'update'
]);

最后,我们可以通过向 http://localhost:8000/api/posts 发送POST请求来测试我们的API。以下是一个使用Postman应用程序的示例

文档

{
  "title" : "Second Post",
  "body" : "This is my second post.",
  "slug" : "second-blog-post"
}

我们可以检查MongoDB数据库,并看到博客文章已被存储

我们还应该能够通过访问 http://localhost:8000/post/second-blog-post 来看到新文章。

从数据库中删除数据

你可能已经注意到,如果没有在模型上指定主键,则使用_id属性作为每条记录的主键。

要删除记录,我们可以使用该id来查找并删除记录。由于我们已为文章定义了资源路由,我们只需要在PostController中添加一个destroy()方法

public function destroy($postId)
 {
     $post = Post::find($postId);
     $post->delete();

     return response()->json(["result" => "ok"], 200);       
 }

然后,我们可以向API端点 http://localhost:8000/api/posts/<post_id> 发送DELETE请求来删除文章。

在数据库中更新数据

我们已经创建了创建和删除博客文章的API。我们可能还想创建一个用于更新博客文章的API。这与前面的示例非常相似。我们只需要向PostController添加一个方法

 public function update(Request $request, $postId)
   {
       $post = Post::find($postId);
       $post->title = $request->title;
       $post->body = $request->body;
       $post->slug = $request->slug;
       $post->save();

       return response()->json(["result" => "ok"], 201);       
   }

现在,我们可以向API端点 http://localhost:8000/api/posts/<post_id> 发送PUT请求,并提供更新后的博客文章内容。

总结

  • 在本文中,我们展示了如何快速启动Laravel应用程序,使用MongoDB作为数据存储。
  • 与MySQL等关系型数据库不同,你不需要担心创建和维护数据库迁移。你可以使用你可能已经熟悉的相同的Eloquent模型功能。
  • 你还可以通过访问我们的官方文档,利用MongoDB提供的额外查询功能
  • 如果你是PHP开发者,请考虑在下一个应用程序中使用Laravel与MongoDB。

准备好开始了吗?

启动一个新的集群或将应用程序迁移到MongoDB Atlas,无需停机。

常见问题解答

Laravel支持MongoDB吗?

是的。Laravel-MongoDB库很好地集成到Laravel Eloquent模型中,允许开发人员无需额外努力即可使用MongoDB。

MongoDB如何连接到Laravel?

您可以在config/database.php文件中按照与其他数据库相同的方式配置数据库连接。如果您的Laravel配置使用多个数据库,您还需要在Laravel模型中指定要使用的连接。

我可以使用MongoDB与Laravel一起使用吗?

是的,MongoDB与Laravel一起使用是一个非常好的选择。Laravel-MongoDB库与Laravel Eloquent模型集成得非常好,允许开发者无需额外努力即可使用MongoDB。

哪种数据库最适合Laravel?

没有一种数据库适合所有类型的应用程序。然而,MongoDB是一个很好的起点,因为它不需要像MySQL、MariaDB或Postgresql这样的关系数据库所需的模式维护和迁移。

我可以用PHP使用MongoDB吗?

是的,MongoDB有一个可以直接从PHP使用的PHP驱动程序。对于大多数应用程序,您可能希望通过像Laravel这样的框架使用它,因为它将最小化所需的编码量。

我应该何时使用MongoDB?

MongoDB可用于大多数类型的应用程序。其灵活的模式方法使其成为构建随着时间的推移数据模型演变的小型应用程序的绝佳选择。它还具有良好的可扩展性,使其成为大量数据的绝佳选择。

Laravel可以连接到多个MongoDB数据库吗?

是的,Laravel支持连接到多个数据库。每个数据库连接都需要在config/database.php文件中定义。Laravel可以与多个MongoDB数据库或MongoDB与其他数据库的混合一起通信。