Laravel在模型中动态设置表名

时间:2018-03-09 04:54:11

标签: laravel-5.3

我想为"用户"进行水平分区。具有大量行的表。所以我拆分了表,然后是users_1,users_2等。这些表是动态生成的。

我的问题是如何在laravel模型中动态设置表名。我尝试了以下选项,它工作正常。

$hash = 1;
$user = new User();
$user->setTable('users_'. $hash);
$user->where('id', 23)->get();

这里我从users_1表中得到结果; 但是当我打电话时

User::all();

它使用的是表用户,而不是用户_1。

我也试过在模型的__construct方法中使用setTable()。但问题是$ hash是根据控制器中使用的值来计算的,这个值没有进入模型的构造方法。

有没有解决方案?

3 个答案:

答案 0 :(得分:0)

可能这可以帮到你:

$data = new Model;
$data->setTable('users');
dump($data->get());
$data->setTable('users_status');
dump($data->get());
die;

祝你好运。

答案 1 :(得分:0)

您可以创建一个范围来切换查询构建器的“自”部分

将此添加到模型中-

implementation 'com.google.android.libraries.places:places:1.0.0'
implementation 'com.google.maps.android:android-maps-utils:0.5'

然后使用

public function scopeFromTable($query, $tableName) 
{
    $query->from($tableName);
}

您可以通过这种方法使用所有的雄辩方法

答案 2 :(得分:0)

这是由于5.7821323121209 * (10 ** 19)被称为静态获取一个新的Model类对象并默认情况下寻找表用户。如果可以使用通过User::all()创建的$ this实例,则可以使用动态表名称进行调用。 $ this引用特定实例的成员变量和函数。

针对您的情况的最佳解决方案是使用数据库级分区。因此,您无需管理哈希。只需给一个带有create_at字段的分区键static或range,然后您就可以使用setTable()调用单个表来获取所有用户,而无需动态调用。或者可以检出数据库碎片。