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脚本的10个技巧(1)
Oct 09 PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
Nov 01 PHP
PHP中图片等比缩放的实例
Mar 24 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
Jun 12 PHP
php简单定时执行任务的实现方法
Feb 23 PHP
PHP aes (ecb)解密后乱码问题
Jun 22 PHP
php实现网页缓存的工具类分享
Jul 14 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
基于swoole实现多人聊天室
Jun 14 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 三维饼图的实现代码
2008/09/28 PHP
php 进度条实现代码
2009/03/10 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
php轻松实现文件上传功能
2016/03/03 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
Python内置数据类型详解
2014/08/18 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
耐克亚太地区:Nike APAC
2019/12/07 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
法制教育演讲稿
2014/09/10 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
清洁工工作总结
2015/08/11 职场文书
2015年店长个人工作总结
2015/10/23 职场文书
创业计划书之寿司
2019/07/19 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
php去除deprecated的实例方法
2021/11/17 PHP