Laravel / Mongodb - 如何在控制器中设置集合名称?

问题描述 投票:0回答:2

在我的laravel项目中,我需要使用Mysql和Mongodb数据库。对于 mongodb,我使用这个包:https://github.com/jenssegers/laravel-mongodb

我有一个模特名字叫

Import.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Jenssegers\Mongodb\Eloquent\Model;

class Import extends Model
{
    protected $connection = 'mongodb';
    protected $collection = 'products_46';

    // protected $table = 'projects';
}

和一个名为

ImportController.php

的控制器
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\Import;
use App\Models\Projects;
use Illuminate\Database\Eloquent\Collection;

class ImportController extends Controller
{   
      
    public function get_all_products() {

        // Predefined key
        $predefined_keys = [ 'image_link', 'title', 'price', 'brand', 'link' ];

        // Get all the products
        $get_products = Import::paginate(10);

        return response()->json($get_products, 200);    
    }
}

现在,在模型中您可以看到我设置了一个工作正常的

$collection
名称。但是如何在控制器中设置集合名称?因为我需要动态地设置集合名称!

注意:在我的 mongodb 数据库中,我有这些集合: 产品_1、产品_2、产品_3等等.....

laravel mongodb
2个回答
1
投票

如果您有 2/3 个集合,则创建具有单独名称和

$collection
设置的 2/3 模型并相应地使用它们。但如果你有更多的模型,或者你根本不想使用多个模型,那么你必须使用
DB::collection
进行动态收集。出于安全原因,Laravel 将其集合/表名称设置为
protected
,并且不应将其设置为 public。

这是使用

DB
的示例。

DB::collection('books')->get();

或者

$hungerGames = DB::collection('books')->where('name', 'Hunger Games')->first();

因此,为了您的代码目的,将

DB::collection('books')
更改为
DB::collection('product_1')
DB::collection('product_2')
等。

它就像 Laravel 一样普通的查询构建器。没有别的了。

请勿将

$collection
设置为公开。


0
投票

继续Razin的回答,当使用DB Facade时,请确保指定连接

$hungerGames = DB::connection('mongodb')->collection('books')->where('name', 'Hunger Games')->first();
© www.soinside.com 2019 - 2024. All rights reserved.