Laravel模型间关系设置分表的方法示例


Posted in PHP onApril 21, 2018

Eloquent是什么

Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 “对象关系映射”(如果只把它当成 Database Abstraction Layer 数组库抽象层那就太小看它了)。所谓 “对象”,就是本文所说的 “模型(Model)”;对象关系映射,即为模型间关系。中文文档: http://laravel-china.org/docs/eloquent#relationships

引用

在实际开发中经常用到分库分表,比如用户表分成 100 张,那么这个时候查询数据需要设置分表,比如 Laravel 的 Model 类中提供了 setTable 方法:

/**
 * Set the table associated with the model.
 *
 * @param string $table
 * @return $this
 */
public function setTable($table)
{
 $this->table = $table;
 
 return $this;
}

那么对数据表的增删改查需要先 new 一个模型实例,再设置表名。如:

(new Circle())->setTable("t_group_" . hashID($userid, 20))
->newQuery()
->where('group_id', $request->group_id)
->update($attributes);

这个很简单,那么在模型间关系比如 HasOne,HasMany 等使用这种方式的情况下,如何设置分表呢?

找了半天没找到好的办法,以 HasOne 为例,看了 Model 类 HasOne 函数的实现方法,没有地方可以设置表名,只好复制一份 HasOne 方法进行修改。比如改成 myHasOne,加上 $table 参数可以设置表名,并且在对象实例化后调用 setTable,果然就可以了。

代码如下:

public function detail()
{
 return $this->myHasOne(Circle::class, 'group_id', 'group_id', 't_group_' . hashID($this->userid, 20));
}
 
public function myHasOne($related, $foreignKey = null, $localKey = null, $table)
{
 $foreignKey = $foreignKey ?: $this->getForeignKey();
 
 $instance = (new $related)->setTable($table);
 
 $localKey = $localKey ?: $this->getKeyName();
 
 return new HasOne($instance->newQuery(), $this, $instance->getTable() . '.' . $foreignKey, $localKey);
}

不知道大家有没有更优雅的方式。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP+MySQL 手工注入语句大全 推荐
Oct 30 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
Apr 22 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 PHP
php实现汉字验证码和算式验证码的方法
Mar 07 PHP
php类自动加载器实现方法
Jul 28 PHP
php构造方法中析构方法在继承中的表现
Apr 12 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
laravel返回统一格式错误码问题
Nov 04 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
Aug 17 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 #PHP
PHP排序算法之堆排序(Heap Sort)实例详解
Apr 21 #PHP
PHP实现Huffman编码/解码的示例代码
Apr 20 #PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 #PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
Apr 20 #PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 #PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 #PHP
You might like
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
js实现的格式化数字和金额功能简单示例
2019/07/30 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
python导入模块交叉引用的方法
2019/01/19 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
10行Python代码计算汽车数量的实现方法
2019/10/23 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
雷曼兄弟的五金店:Lehman’s Hardware Store
2019/04/10 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
自荐信如何“自荐”
2013/10/24 职场文书
大学生村官事迹材料
2014/01/21 职场文书
大学社团活动策划书
2014/01/26 职场文书
会计电算化学生个人的自我评价
2014/02/08 职场文书
硕士生工作推荐信
2014/03/07 职场文书
班级文化标语
2014/06/23 职场文书
失恋33天观后感
2015/06/11 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
redis内存空间效率问题的深入探究
2021/05/17 Redis
详解Go与PHP的语法对比
2021/05/29 PHP
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技