如何在 laravel 4.2 中动态更改模型表?

Posted

技术标签:

【中文标题】如何在 laravel 4.2 中动态更改模型表?【英文标题】:How to change table of model dynamically in laravel 4.2? 【发布时间】:2015-12-26 12:53:18 【问题描述】:

众所周知,新建模型后,有一个函数可以改变模型使用的表。

例如,

$example_model = new ExampleModel;
$example_model->setTable('myTable_'.$some_other_variable);

但是,如果我从表中查找记录,有没有办法在查询数据库之前选择表?

即像这样的

$example_model = ExampleModel::setTable('myTable_'.$some_other_variable)->where('myColumn', $variable_to_be_compared)->get();

(注意到下面这行不正确。我会说 setTable 不是静态方法)

我的模型中有一些自定义函数,所以我不想使用DB::table('myTable_'.$some_other_variable)

【问题讨论】:

【参考方案1】:

上游 setTable() 方法的问题在于它不返回任何内容 (void),因此即使您设法调用它,也无法将其与其他方法链接,除非您覆盖它。

// File: ExampleModel.php
/**
 * Set the table associated with the model.
 *
 * @param  string  $table
 * @return self
 */
public function setTable($table)

    $this->table = $table;
    return $this;

然后你可以做这样的事情

$example_model = with(new ExampleModel)->setTable('myTable_'.$some_other_variable)->where('myColumn', $variable_to_be_compared)->get();

但由于该解决方案涉及编写方法,因此您可以为该任务编写一个新的静态方法,这样您就不需要使用帮助程序

/**
* Change the table associated with the model.
*
* @param  string  $table
* @param  array   $attributes
* @return self
*/
public static function changeTable($table, $attributes = [])

    $instance = new static($attributes);
    $instance->setTable($table);

    return $instance;

哪个可以用

$example_model = ExampleModel::changeTable('myTable_'.$some_other_variable)->where('myColumn', $variable_to_be_compared)->get();

【讨论】:

以上是关于如何在 laravel 4.2 中动态更改模型表?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 laravel 中的用户模型以使用其他表进行身份验证而不是用户?

laravel 模型 - 如何在模型中动态设置列值?

在 laravel 中使用 x-editable 更改动态状态

Laravel 在查询之前更改模型表

在 Laravel 4.2 Artisan 命令中更改应用程序 url

如何制作 Laravel 动态数据表? [关闭]