Laravel模型的动态表名

0sgqnhkj  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(198)

对于我的应用程序,我将有多个具有相同基本结构的表(自动生成的表)。例如,我有表survey_1survey_2survey_23。是否可以创建如下模型:new Survey(2),它将为表survey_2生成模型?

scyqe7ek

scyqe7ek1#

我有这个。在laravel 6。我还没有决定这个想法,我想我宁愿有多个数据库和使用单独的连接...但这不是问题。

<?php

namespace App\Models\Eloquent;

use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
    
    protected $table = null;
   
    protected $fillable = [
        'data',
    ];

    protected $casts = [
        'data' => 'object',
    ];

    public function setTable($tableName)
    {
        $this->table = $tableName;
    }

    public function scopeTable($query, $tableName)
    {
        $query->getQuery()->from = $tableName;
        return $query;
    }

}

测试路径:

Route::get('/write', function () {

    $project = new \App\Models\Eloquent\Project();
    $project->setTable('project_2');
    $project->data = ['hello' => 'dolly'];
    $project->save();

});

Route::get('/read', function () {

    $data = \App\Models\Eloquent\Project::query()
        ->table('project_2')
        ->where('data', 'like', '%dolly%')
        ->get();

    return $data;

});

但是这个可以。哦。是的。我把我的模特放在App\Models\Eloquent里......这是可选的。

wgmfuz8q

wgmfuz8q2#

我觉得有可能。试着覆盖模型中的__constructor方法

class Survey extends Model
{
    public function __construct( array $attributes = [] )
    {
        parent::construct($attributes);
        if (array_key_exists('table', $attributes)) {
           $this->setTable($attributes['table']) ;
        }
        else {
            // do staff when table is not specified 
        }
    }
}

那么

$survey_1 = new Survey(['table' => 'survey_1']); 
$survey_2 = new Survey(['table' => 'survey_2']); 
$survey_3 = new Survey(['table' => 'survey_3']);

我不知道它会不会起作用。
但我强烈建议您不要使用单独表格的方法。

相关问题