Laravel模型间关系设置分表的方法示例
Eloquent是什么
Eloquent是一个ORM,全称为ObjectRelationalMapping,翻译为“对象关系映射”(如果只把它当成DatabaseAbstractionLayer数组库抽象层那就太小看它了)。所谓“对象”,就是本文所说的“模型(Model)”;对象关系映射,即为模型间关系。中文文档:http://laravel-china.org/docs/eloquent#relationships
引用
在实际开发中经常用到分库分表,比如用户表分成100张,那么这个时候查询数据需要设置分表,比如Laravel的Model类中提供了setTable方法:
/** *Setthetableassociatedwiththemodel. * *@paramstring$table *@return$this */ publicfunctionsetTable($table) { $this->table=$table; return$this; }
那么对数据表的增删改查需要先new一个模型实例,再设置表名。如:
(newCircle())->setTable("t_group_".hashID($userid,20)) ->newQuery() ->where('group_id',$request->group_id) ->update($attributes);
这个很简单,那么在模型间关系比如HasOne,HasMany等使用这种方式的情况下,如何设置分表呢?
找了半天没找到好的办法,以HasOne为例,看了Model类HasOne函数的实现方法,没有地方可以设置表名,只好复制一份HasOne方法进行修改。比如改成myHasOne,加上$table参数可以设置表名,并且在对象实例化后调用setTable,果然就可以了。
代码如下:
publicfunctiondetail() { return$this->myHasOne(Circle::class,'group_id','group_id','t_group_'.hashID($this->userid,20)); } publicfunctionmyHasOne($related,$foreignKey=null,$localKey=null,$table) { $foreignKey=$foreignKey?:$this->getForeignKey(); $instance=(new$related)->setTable($table); $localKey=$localKey?:$this->getKeyName(); returnnewHasOne($instance->newQuery(),$this,$instance->getTable().'.'.$foreignKey,$localKey); }
不知道大家有没有更优雅的方式。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。