前言:

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使用方法的更多相关文章

  1. MySQL数据库分表的3种方法

    原文地址:MySQL数据库分表的3种方法作者:dreamboycx 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目 ...

  2. 织梦dede解决“更新数据库archives表时出错"方法

    登陆dedecms网站管理后台,选择执行 sql命令工具,将下列命令执复制进去并执行多行执行,该问题就可以解决. alter table `idea_archives` ADD `voteid` me ...

  3. Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...

  4. phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建

    phalcon: 按年分表的model怎么建?table2017,table2018...相同名的分表模型怎么建 场景:当前有一张表:Ntime,因为表太大了,考虑要分表: Ntime2017 Nti ...

  5. zabbix 数据库分表操作

    近期zabbix数据库占用的io高,在页面查看图形很慢,而且数据表已经很大,将采用把数据库的数据目录移到新的磁盘,将几个大表进行分表操作 一.数据迁移: 1.数据同步到新的磁盘上,先停止mysql(不 ...

  6. 在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 ...

  7. laravel框架中所用到的依赖注入

    用Laravel开发前前后后有2个月左右了,之前一直写Java,就像找到Java和PHP之前的共同点,用Java的某些原理去理解PHP会发现还是有很多共通之处的.Java的依赖注入已经是一个很常见的概 ...

  8. C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation

    C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation 后台添加以下方法:/// <summa ...

  9. TP框架中ajax post请求时提示404

    ajax post请求时提示404错误 TP框架中ajax post请求时提示404 找了半天是 控制器中方法有错误! 下次再遇到去控制器方法中找一步一步找,肯定能找到,我是单词拼错了!

  10. laravel框架中Job和事件event的解析

    本篇文章给大家带来的内容是关于laravel框架中Job和事件event的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在做项目的时候,一直对Job和Event有个疑惑.感觉两 ...

随机推荐

  1. OpenHarmony亮相MTSC 2023 | 质量&效率共进,赋能应用生态发展

      11月25日,MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行.大会以"软件质量保障体系和测试研发技术交流"为主要目的,旨在为行业搭建一个深入探讨 ...

  2. OpenHarmony嵌套类对象属性变化:@Observed装饰器和@ObjectLink装饰器

    上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型.对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第 ...

  3. 【直播回顾】OpenHarmony知识赋能六期第五课—WiFi子系统

    8月11日晚上19点,知识赋能第六期第五节直播 <OpenHarmony知识赋能-WiFi子系统> ,在OpenHarmony开发者成长计划社群内成功举行. 第六期直播由从事底层基础工作1 ...

  4. 深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓

    在本文中,我们将介绍 IoC(控制反转)和 DI(依赖注入)的概念,以及如何在 Spring 框架中实现它们. 什么是控制反转? 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给 ...

  5. Go 语言函数、参数和返回值详解

    函数是一组语句,可以在程序中重复使用.函数不会在页面加载时自动执行.函数将通过调用函数来执行. 创建函数 要创建(通常称为声明)一个函数,请执行以下操作: 使用 func 关键字. 指定函数的名称,后 ...

  6. 难道AI不知道tnsnames.ora的instance_name配置吗?

    事情是这样,给某客户培训构建hands-on实验环境时,因测试环境有限,在同一环境做了一套ADG环境: 数据库是单实例,版本19.21,使用了多租户选件: 其中一个测试的PDB,名为demo1,其中建 ...

  7. innoSetup打包文件编写模板

    现在打包主要是使用 innosetup 这个软件来进行打包,支持录制脚本和手动编写脚本,比较好用. 此文章主要记录手写脚本,便于后期查询,借鉴. 文档: inno setup :https://blo ...

  8. 踩坑指南:入门OpenTenBase之部署篇

    引言 OpenTenBase 企业级分布式HTAP开源数据库,具备高扩展性.商业数据库语法兼容.分布式HTAP引擎.多级容灾和多维度资源隔离等能力,成功应用在金融.医疗.航天等行业的核心业务系统. 这 ...

  9. 选择排序的基本实现【数据结构与算法—TypeScript 实现】

    笔记整理自 coderwhy 『TypeScript 高阶数据结构与算法』课程 概念 本质:两两元素相比较,先扫描一遍未排序数列,把未排序的数列中的最小(大)元素,放到数列的已排序的末尾 特性 选择排 ...

  10. VScode 使用emmet

    背景 在很多的编辑场合,很多时候回出现很多逻辑性的问题.可能觉得html是一门没有逻辑的语言,实际上,它是有一定的思想编辑的.后来出现了emmet,这个不仅仅是一种快捷方式,同时也是一种思考方式. 解 ...