Laravel Eloquent 分表方法 支持create 和with等静态声明model的方法
分表设计 最先想到的就是 Laravel Eloquent 调用setTable方法,每次都重新设置表名给其加上后缀。示例如下
$model = User();
$model->setTable('user_2020_11')->get();
但是这样写有一个问题,当调用crate 或者 with 时setTable没起作用,原因是它是直接用的static声明的静态调用没走类的setTable();
所以只能走另一套方案,先将新表名设置在静态属性tableName中,覆盖掉Model类的getTable方法获取时优先去静态属性tableName,具体代码如下
在对应Modle中增加如下代码:
protected static $tableName = null;//设置静态表名
/**
* 获取表名重构(兼容静态调用的方法)
* @return mixed|string
*/
public function getTable()
{
return static::$tableName?:parent::getTable();
}
/**
* 设置表名
* @param null $time
*/
public function setTableName($time = null)
{
static::$tableName = null;
$table = $this->getTable().'_'.$this->asDateTime($time)->format('Y_m');//获取新表名这里我做的逻辑是加上月份后缀,具体新表名规则自己定义
if(!Cache::has('hasTable:'.$table)){
if(!Schema::hasTable($table)){
//当不存在表时这里写自己逻辑创建新表或者抛出异常
}
Cache::forever('hasTable:'.$table,1);
}
static::$tableName = $table;
return $this;
}
调用时直接按如下示例调用即可
$model = User();
$model->setTableName('2020-11')->with('post')->get();
如有更好方案欢迎留言,如果能帮到小伙伴,麻烦点个赞
本作品采用《CC 协议》,转载必须注明作者和本文链接