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 配置文件中open_basedir选项作用
Jul 19 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
ThinkPHP标签制作教程
Jul 10 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
php生成html文件方法总结
Dec 01 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
Dec 15 PHP
php关联数组快速排序的方法
Apr 17 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
Aug 25 PHP
windows8.1下Apache+Php+MySQL配置步骤
Oct 30 PHP
php验证手机号码
Nov 11 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
Dec 06 PHP
PHP简单实现模拟登陆功能示例
Sep 15 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
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
mac下安装nginx和php
2013/11/04 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
js计算任意值之间随机数的方法
2015/01/16 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python sys.path详细介绍
2013/10/17 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
Django如何自定义分页
2018/09/25 Python
学Python 3的理由和必要性
2019/11/19 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
初中生三年学习生活的自我评价
2013/11/03 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
班主任寄语大全
2014/04/04 职场文书
甲乙双方合作协议书
2014/10/13 职场文书
会计专业自荐信范文
2015/03/05 职场文书
主持人开场白台词
2015/05/29 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python