Laravel模型的动态表名

时间:2016-05-27 13:36:33

标签: php laravel laravel-5 eloquent

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

2 个答案:

答案 0 :(得分:1)

我认为这是可能的。尝试覆盖模型中的__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']); 

我不知道它是否有效。
但我强烈建议您不要在单独的表格中使用您的方法。

答案 1 :(得分:1)

我有这个。在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...。这是可选的。