• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
薛建朝 显示全部楼层 发表于 2021-10-25 20:17:33 |阅读模式 打印 上一主题 下一主题
Eloquent是什么
Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 “对象关系映射”(假如只把它当成 Database Abstraction Layer 数组库抽象层那就太小看它了)。所谓 “对象”,就是本文所说的 “模子(Model)”;对象关系映射,即为模子间关系。中文文档: http://laravel-china.org/docs/eloquent#relationships

引用
在实际开辟中经常用到分库分表,比如用户表分成 100 张,那么这个时间查询数据必要设置分表,比如 Laravel 的 Model 类中提供了 setTable 方法:
  1. /**
  2. * Set the table associated with the model.
  3. *
  4. * @param string $table
  5. * @return $this
  6. */
  7. public function setTable($table)
  8. {
  9. $this->table = $table;
  10. return $this;
  11. }
复制代码
那么对数据表的增编削查必要先 new 一个模子实例,再设置表名。如:
  1. (new Circle())->setTable("t_group_" . hashID($userid, 20))
  2. ->newQuery()
  3. ->where('group_id', $request->group_id)
  4. ->update($attributes);
复制代码
这个很简朴,那么在模子间关系比如 HasOne,HasMany 等利用这种方式的环境下,怎样设置分表呢?
找了半天没找到好的办法,以 HasOne 为例,看了 Model 类 HasOne 函数的实现方法,没有地方可以设置表名,只好复制一份 HasOne 方法举行修改。比如改成 myHasOne,加上 $table 参数可以设置表名,并且在对象实例化后调用 setTable,果然就可以了。
代码如下:
  1. public function detail()
  2. {
  3. return $this->myHasOne(Circle::class, 'group_id', 'group_id', 't_group_' . hashID($this->userid, 20));
  4. }
  5. public function myHasOne($related, $foreignKey = null, $localKey = null, $table)
  6. {
  7. $foreignKey = $foreignKey ?: $this->getForeignKey();
  8. $instance = (new $related)->setTable($table);
  9. $localKey = $localKey ?: $this->getKeyName();
  10. return new HasOne($instance->newQuery(), $this, $instance->getTable() . '.' . $foreignKey, $localKey);
  11. }
复制代码
不知道大家有没有更优雅的方式。
总结
以上就是这篇文章的全部内容了,渴望本文的内容对大家的学习大概工作具有一定的参考学习代价,假如有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作