使用Laravel Moloquent创建MongoDB索引及集合判断问题
解决Moloquent索引创建错误与MongoDB集合检查创建问题
嘿,作为经常用Jenssegers/Laravel-MongoDB开发的人,我来帮你搞定这两个问题:
一、修复「Schema类找不到」的错误
你碰到的Class Jenssegers\Mongodb\Schema' not found报错,根源是你调用了Schema::collection()但没引入正确的MongoDB专属Schema类。你现在只引入了Blueprint和基础Migration,得补上Jenssegers的Schema:
use Jenssegers\Mongodb\Schema\Schema; // 必须加这个! use Jenssegers\Mongodb\Schema\Blueprint; use Illuminate\Database\Migrations\Migration;
然后调整迁移代码,记得指定MongoDB连接,避免用默认的SQL连接:
public function up() { Schema::connection('mongodb')->collection('events', function (Blueprint $table) { $table->index(['location' => '2dsphere']); }); } public function down() { Schema::connection('mongodb')->collection('events', function (Blueprint $table) { $table->dropIndex(['location' => '2dsphere']); }); }
二、检查集合是否存在并创建
有几种实用的方式可以实现这个需求,看你偏好哪种:
方式1:通过你的MongoTest模型操作
直接利用现有的模型,借助原生MongoDB连接来检查和创建:
use App\Http\Model\MongoTest; // 获取模型关联的MongoDB连接实例 $connection = MongoTest::getConnection(); // 获取对应的数据库对象 $db = $connection->getMongoDB(); // 检查指定集合是否存在 if (!$db->listCollections(['name' => 'test'])->hasNext()) { // 如果不存在就创建,这里用默认配置,也可以加自定义选项比如大小、索引 $db->createCollection('test'); }
方式2:用DB门面直接操作
如果不想通过模型,也可以用Laravel的DB门面指定MongoDB连接来操作:
use Illuminate\Support\Facades\DB; $db = DB::connection('mongodb')->getMongoDB(); if (!$db->listCollections(['name' => 'your_collection_name'])->hasNext()) { $db->createCollection('your_collection_name'); }
小提示:MongoDB自动创建集合
其实MongoDB本身有个特性:当你通过模型执行第一个插入或查询操作时,会自动创建对应的集合。比如你跑一行代码:
MongoTest::create(['some_field' => 'some_value']);
如果test集合还不存在,MongoDB会自动帮你建好,完全不用手动创建~
另外给你的MongoTest模型提个小建议,把use Moloquent;改成更清晰的写法,避免潜在的命名冲突:
<?php namespace App\Http\Model; use Jenssegers\Mongodb\Eloquent\Model as Moloquent; class MongoTest extends Moloquent { protected $connection = 'mongodb'; protected $collection = 'test'; }
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

