Laravel框架中数据库分表时Model使用方法

6 篇文章 0 订阅

前言:
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,本人项目生产环境目前使用的是这两种方法。

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值