当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-11 11:06:11 浏览: 评论:0 

这篇文章主要给大家介绍了关于Laravel模型间关系设置分表的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

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.  $this->table = $table
  9.    
  10.  return $this

那么对数据表的增删改查需要先 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.  return $this->myHasOne(Circle::class'group_id''group_id''t_group_' . hashID($this->userid, 20)); 
  3.    
  4. public function myHasOne($related$foreignKey = null, $localKey = null, $table
  5.  $foreignKey = $foreignKey ?: $this->getForeignKey(); 
  6.    
  7.  $instance = (new $related)->setTable($table); 
  8.    
  9.  $localKey = $localKey ?: $this->getKeyName(); 
  10.    
  11.  return new HasOne($instance->newQuery(), $this$instance->getTable() . '.' . $foreignKey$localKey); 

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

Tags: Laravel模型 Laravel设置分表

分享到: