如何动态设置Laravel Model表/集合?

dm7nw8vv  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(156)

我使用的是GitHub - jenssegers/laravel-mongodb:基于MongoDB的Laravel语言模型及查询生成器在我的Laravel项目中,我创建了动态设置Model表名的DB模型(在Mongodb case集合中)。

use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

class DbData extends Model
    {   
        protected   $collection = 'default_collection';
        function __construct($collection)
            {
                $this->collection = $collection;
            }
    }

当我为数据插入创建新的DbData对象时,这是有效的:

$data = new DbData('dynamic_collection_name');
$data->variable = 'Test';
$data->save();

但是这个解决方案还不足以让我使用这个DbData模型从我的数据库中查询数据。我想要实现的是增加为DbModel传递变量的可能性,例如:

$data = DbData::setCollection('dynamic_collection_name');
$data->get();
dbf7pr2w

dbf7pr2w1#

你也许可以在你的课上做这样的事情。

use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

class DbData extends Model
{   
    protected   $collection = 'default_collection';

    public function __construct($collection)
    {
        $this->collection = $collection;
    }

    public static function setCollection($collection)
    {
        return new self($collection);
    }
}

这将允许您调用DbData::setCollection('collection_name'),并且只为该特定示例设置集合名称。

vq8itlhq

vq8itlhq2#

<?php

namespace App\Models;

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

class DbData extends Eloquent
{
    use HasFactory;

    // if you need to set default collection also then uncomment below line.
    // protected $collection = 'defaultCollectionIfWantsToSet';

    /**
     * set collection name
     *
     * @param  string $collection
     * @return $this
     */
    public static function setCollection($collection)
    {
        $instance = new self();
        $instance->collection = $collection;
        return $instance;
    }

    // OR you can use function as like below also
    // public static function setCollection($collection)
    // {
    //     $instance = new self();
    //     return $instance->setTable($collection);
    // }
}

这将允许您调用DbData::setCollection('collection_name'),并且仅为该特定示例设置集合名称
我用Laravel 8和9进行了测试

相关问题