在我的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等等.....
如果您有 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
设置为公开。
继续Razin的回答,当使用DB Facade时,请确保指定连接
$hungerGames = DB::connection('mongodb')->collection('books')->where('name', 'Hunger Games')->first();