Laravel框架中数据库分表时Model使用方法
前言:
0、最近在使用laravel框架做MySQL分表的时候经过实践和踩坑,总结了以下3种可行的分表方法,亲测可用。
1、本人公司做的是SaaS系统,以店铺为维度。店铺id(shop_id) 命名规则为: shop+6位随机数字字母+4位数字 。 示例:shopHqlTPT3482 、shopk9nj5m3714。
2、最近在做一个CRM系统,用户表 t_user表,由于数据量较大,于是决定对店铺id(shop_id) 取模 拆分成20个表 ,表名分别是t_user_0,t_user_1,t_user_2,.....t_user_17,t_user_18,t_user_19。
3、本分表方法使用的laravel版本 是 laravel 6.x,其它版本可能有些许差异,使用的时候注意区分哦。
4、t_user_ 表 的model文件 命名为 TUser.php。
下面开始讲述分表方法,以及对应的调用分表后model的方法:
方法1: 在t_user表 的 model中 对 $this->table 重新赋值。
TUser.php 文件内容如下:
namespace App\Models;
class TUser extends Model
{
protected $table = '';
public function __construct()
{
parent::__construct();
$this->table = self::getTableByShopId(); //重写表名
}
public static function getTableByShopId()
{
$shop_id = Utils::getShopId(); //取当前店铺id
$prefix = 't_user_';
$num = fmod(sprintf("%u", crc32($shop_id)), 20); //取模分表,分20张;使用%u解决32位下出现负数的问题
return $prefix . $num;
}
}
调用该model的方法如下:
TUser::query()->where('shop_id','shopHqlTPT3482')->first(); //此时查询的就是 t_user_14 这张表
方法2:在t_user表 的 model中重写 getTable 方法。
TUser.php 文件内容如下:
namespace App\Models;
class TUser extends Model
{
//重写laravel 框架底层的 getTable() 方法
public function getTable() {
$shop_id = Utils::getShopId(); //取当前店铺id
$prefix = 't_user_';
$num = fmod(sprintf("%u", crc32($shop_id)), 20);//取模分表,分20张;使用%u解决32位下出现负数的问题
return $prefix . $num;
}
}
调用该model的方法如下:
TUser::query()->where('shop_id','shopHqlTPT3482')->first(); //此时查询的就是 t_user_14 这张表
方法3:在t_user表 的 model中使用 setTable 方法 将 shop_id 取模后拼接的表名,写入到model底层。
TUser.php 文件内容如下:
namespace App\Models;
class TUser extends Model
{
//获取分表后的model
public function getSplitModel($shop_id)
{
return (new self())->setTable($this->getTclueTableName($shop_id))->newQuery();
}
//获取 t_user 表的表名
public function getTuserTableName(string $shop_id)
{
return 't_user_' . fmod(sprintf("%u", crc32($shop_id)), 20);//取模分表,分20张;使用%u解决32位下出现负数的问题
}
}
调用该model的方法如下:
$shop_id = 'shopHqlTPT3482';
(new TUser())->getSplitModel($shop_id)->where('shop_id','shopHqlTPT3482')->first(); //此时查询的就是 t_user_14 这张表
总结:
以上,就是3种使用laravel框架分表的方法了。推荐使用方法2和方法3,本人项目生产环境目前使用的是这两种方法。
Laravel框架中数据库分表时Model使用方法的更多相关文章
- MySQL数据库分表的3种方法
原文地址:MySQL数据库分表的3种方法作者:dreamboycx 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目 ...
- 织梦dede解决“更新数据库archives表时出错"方法
登陆dedecms网站管理后台,选择执行 sql命令工具,将下列命令执复制进去并执行多行执行,该问题就可以解决. alter table `idea_archives` ADD `voteid` me ...
- Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法
Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...
- phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建
phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建 场景:当前有一张表:Ntime,因为表太大了,考虑要分表: Ntime2017 Nti ...
- zabbix 数据库分表操作
近期zabbix数据库占用的io高,在页面查看图形很慢,而且数据表已经很大,将采用把数据库的数据目录移到新的磁盘,将几个大表进行分表操作 一.数据迁移: 1.数据同步到新的磁盘上,先停止mysql(不 ...
- 在Oracle 11.2的数据库中建表时遇到 RESULT_CACHE (MODE DEFAULT) ORA-00922: missing or invalid option
在Oracle 11.2的数据库中建表时遇到 RESULT_CACHE (MODE DEFAULT) ORA-00922: missing or invalid option hostdr:[/ho ...
- laravel框架中所用到的依赖注入
用Laravel开发前前后后有2个月左右了,之前一直写Java,就像找到Java和PHP之前的共同点,用Java的某些原理去理解PHP会发现还是有很多共通之处的.Java的依赖注入已经是一个很常见的概 ...
- C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation
C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation 后台添加以下方法:/// <summa ...
- TP框架中ajax post请求时提示404
ajax post请求时提示404错误 TP框架中ajax post请求时提示404 找了半天是 控制器中方法有错误! 下次再遇到去控制器方法中找一步一步找,肯定能找到,我是单词拼错了!
- laravel框架中Job和事件event的解析
本篇文章给大家带来的内容是关于laravel框架中Job和事件event的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在做项目的时候,一直对Job和Event有个疑惑.感觉两 ...
随机推荐
- 预约直播|3月30日下周四,应用促活大揭秘,快速提升DAU
[导读] 日常运营过程中,消息推送是App触达用户的常用手段,无论是新功能的通知,还是活动的提醒,都可以通过推送告知用户.千人千面的个性化推送,对于提升用户粘性.用户转化等指标都具有明显正向效果.越来 ...
- HDC2021技术分论坛:HarmonyOS低代码开发介绍
作者:sunyuhui,wangxiaoyan,华为2012实验室软件IDE专家 什么是低代码开发?低代码开发主要特点有哪些?如何利用低代码开发原子化服务?本文带你一探究竟~ 一.什么是Harmony ...
- 解密方舟的高性能内存回收技术——HPP GC
原文:https://mp.weixin.qq.com/s/o8uuP1XViIyviveL4m-8ZQ,点击链接查看更多技术内容. 众所周知,内存是操作系统的一项重要资源,直接影响系统性能.而在应用 ...
- LTV预估的一些思考
什么是LTV 用户生命周期价值(Lifetime Value, LTV)是一个非常重要的指标,定义为单个用户在某种生命周期内(i.e. 从开始使用产品到停止使用期间) 为产品创造的总价值. 比如GMV ...
- c# 后端与前端时间戳的转换
C# DateTime与时间戳转换 C# DateTime与时间戳的相互转换,包括JavaScript时间戳和Unix的时间戳. 1. 什么是时间戳 首先要清楚JavaScript与Unix的时间戳的 ...
- 重启React Native老项目的奇幻之旅:填坑实录与解决方案分享
这两天为了重启五年前基于 React Native(版本 0.59.9)开发的老项目,经过各种填坑查询等操作,最终把它成功地运行起来了. 在这篇文章中,我将详述那些遭遇的挑战以及对应的解决方案,以期为 ...
- PyTorch分分钟快速安装
PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口. 它是由Torch7团队开发,是一个以Pyth ...
- 力扣915(java&python)-分割数组(中等)
题目: 给定一个数组 nums ,将其划分为两个连续子数组 left 和 right, 使得: left 中的每个元素都小于或等于 right 中的每个元素.left 和 right 都是非空的.le ...
- java应用提速(速度与激情)
简介: 本文将阐述通过基础设施与工具的改进,实现从构建到启动全方面大幅提速的实践和理论. 作者 | 阿里巴巴CTO技术来源 | 阿里开发者公众号 联合作者:道延 微波 沈陵 梁希 大熊 断岭 北纬 未 ...
- 谈谈C++新标准带来的属性(Attribute)
简介: 从C++11开始,标准引入了一个新概念"属性(attribute)",本文将简单介绍一下目前在C++标准中已经添加的各个属性以及常用属性的具体应用. 作者 | 寒冬来源 | ...