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动态创建Flash动画
Oct 09 PHP
国外十大最流行的PHP框架排名
Jul 04 PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 PHP
PHP中使用socket方式GET、POST数据实例
Apr 02 PHP
php有效防止同一用户多次登录
Nov 19 PHP
最新最全PHP生成制作验证码代码详解(推荐)
Jun 12 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
Dec 29 PHP
php获取客户端IP及URL的方法示例
Feb 03 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
May 11 PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 PHP
laravel 实现登陆后返回登陆前的页面方法
Oct 03 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 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网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
理解Javascript_03_javascript全局观
2010/10/11 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
js控制table合并具体实现
2014/02/20 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
javascript中Object使用详解
2015/01/26 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
vue实现放大镜效果
2020/09/17 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
Django 全局的static和templates的使用详解
2019/07/19 Python
python3中编码获取网页的实例方法
2020/11/16 Python
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
html5与css3小应用
2013/04/03 HTML / CSS
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
在校学生职业规划范文
2014/01/08 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
离婚协议书怎么写的
2014/12/14 职场文书