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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(2)
Oct 09 PHP
PHP 和 XML: 使用expat函数(三)
Oct 09 PHP
php 目录遍历、删除 函数的使用介绍
Apr 28 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
PHP编译安装中遇到的两个错误和解决方法
Aug 20 PHP
php实现的双向队列类实例
Sep 24 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
PHP调用MySQL存储过程并返回值的方法
Dec 26 PHP
php实现分页显示
Nov 03 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
Mar 21 PHP
Yii2中事务的使用实例代码详解
Sep 07 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
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
解决canvas画布使用fillRect()时高度出现双倍效果的问题
2017/08/03 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
使用JavaScript生成罗马字符的实例代码
2018/06/08 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
python rsa 加密解密
2017/03/20 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
浅谈Django的缓存机制
2018/08/23 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
详解Python locals()的陷阱
2019/03/26 Python
python实现五子棋游戏
2019/06/18 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
董事长职责范文
2013/11/08 职场文书
技术总监岗位职责
2013/12/05 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
倡议书范文大全
2015/04/28 职场文书
2015最新民情日记范文
2015/06/26 职场文书
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记