我想为"用户"进行水平分区。具有大量行的表。所以我拆分了表,然后是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是根据控制器中使用的值来计算的,这个值没有进入模型的构造方法。
有没有解决方案?
答案 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()
调用单个表来获取所有用户,而无需动态调用。或者可以检出数据库碎片。