Laravel Eloquent分表方法并使用模型关联的实现


Posted in PHP onNovember 25, 2019

众所周知 Laravel 是 PHP 开发项目最优美的框架之一,尤其是 Eloquent 对数据库的操作提供了特别多的便利。
在实际开发中我们经常涉及到分库分表场景,那么怎样才能继续配合 Eloquent 优雅的使用 Model 模型呢,接下来给大家分享下我在实际开发中所遇到的问题。(备注:此方法来源 Stack OverFlow 原文地址找不到了,配合我们实际项目更能清晰表述)

1、假设我们有一万本书籍,每本书籍有两千章节,我们创建数据库时的表结构是书籍信息表:books;以及章节信息表:chapters,前面说到书籍越多章节数也就越多解决方案是将章节表分成十个形式为 chapters_0、chapters_1、......chapters_9 表后缀规则是书籍 ID 与 10 取余,这样所有的书籍章节会分散在这 10 个 chapters 中。

2、表建好后开始创建 model 模型,按照惯例所有的模型都将写在 App\Models 下;首先我们先创建一个类名为 Model 的模型并继承 Illuminate\Database\Eloquent\Model

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model as EloquentModel;

class Model extends EloquentModel
{
  protected $suffix = null;

  // 设置表后缀
  public function setSuffix($suffix)
  {
    $this->suffix = $suffix;
    if ($suffix !== null) {
      $this->table = $this->getTable() . '_' . $suffix;
    }
  }

  // 提供一个静态方法设置表后缀
  public static function suffix($suffix)
  {
    $instance = new static;
    $instance->setSuffix($suffix);

    return $instance->newQuery();
  }

  // 创建新的"chapters_{$suffix}"的模型实例并返回
  public function newInstance($attributes = [], $exists = false)
  {
    $model = parent::newInstance($attributes, $exists);
    $model->setSuffix($this->suffix);

    return $model;
  }
}

2、其他模型全都继承以上的 Model 而不是继承 Illuminate\Database\Eloquent\Model,获取某本书的章节 controller

<?php

namespace App\Http\Controllers;

use App\Models\{Book, Chapter};

class ChaptersController extends Controller
{
  public function chapter (Book $book)
  {
    // 章节列表(普通查询)
    $list = Chapter::lists($book->id);

    // 章节列表(使用模型关联)
    $list = $book->chapters()->oldest('id')->get();
  }
}

3、chapter 模型(普通查询)

<?php

namespace App\Models;

class Chapter extends Model
{
  public static function lists ($bookId)
  {
    $suffix = $bookId % 10;
    /*
    * 例如 $sufiix = 1; 我要要获取的就是:chapters_1的模型实例
    * 使用Model类中提供的静态方法创建该表的模型实例
    * 返回指定书籍的章节
    */
    return self::suffix($suffix)->where('book_id', $bookId)->get();
  }
}

3、好了,我们章节的分表模型已经完成了。那么如何使用模型关联呢?我们来看 Book 模型如何关联 Chapter

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\HasMany;

class Book extends Model
{
  public function chapters ()
  {
    /*
    * books表的id和chapters表中的book_id关联
    * 一对多关系(一本书对应多条章节)
    */
    $instance = new Chapter();
    $instance->setSuffix($this->id % 10);

    $foreignKey = $instance->getTable . '.' . $this->getForeignKey();
    $localKey = $this->getKeyName();

    return new HasMany($instance->newQuery(), $this, $foreignKey, $localKey);
  }
}

到此 model 发表查询及 model 关联就完成了,如果有其他更好的方式,请大家不吝赐教。第一次发表文章,如有不对的地方希望大家多多指教!!也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php下检测字符串是否是utf8编码的代码
Jun 28 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
遭遇php的in_array低性能问题
Sep 17 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
Jun 24 PHP
Codeigniter(CI)框架分页函数及相关知识
Nov 03 PHP
ThinkPHP内置jsonRPC的缺陷分析
Dec 18 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
PHP简单实现遍历目录下特定文件的方法小结
May 22 PHP
用PHP的反射实现委托模式的讲解
Mar 22 PHP
安装docker和docker-compose实例详解
Jul 30 PHP
基于laravel缓冲cache的用法详解
Oct 23 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 #PHP
使用Git实现Laravel项目的自动化部署
Nov 24 #PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 #PHP
laravel框架中视图的基本使用方法分析
Nov 23 #PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 #PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 #PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 #PHP
You might like
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
php的闭包(Closure)匿名函数详解
2015/02/22 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
2011/10/16 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
D3.js实现散点图和气泡图的方法详解
2016/09/21 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
Python3基础之list列表实例解析
2014/08/13 Python
python静态方法实例
2015/01/14 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
python如何运行js语句
2020/09/09 Python
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
物业保安主管岗位职责
2013/12/25 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
布达拉宫导游词
2015/02/02 职场文书
基于tensorflow权重文件的解读
2021/05/26 Python
CSS浮动引起的高度塌陷问题
2022/08/05 HTML / CSS