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()

如有更好方案欢迎留言,如果能帮到小伙伴,麻烦点个赞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值