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 相关文章推荐
玩转虚拟域名◎+ .
Oct 09 PHP
PHP学习 运算符与运算符优先级
Jun 15 PHP
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
Oct 15 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
php用header函数实现301跳转代码实例
Nov 25 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
May 13 PHP
php生成Android客户端扫描可登录的二维码
May 13 PHP
PHP面向对象程序设计OOP继承用法入门示例
Dec 27 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 PHP
PHP实现浏览器格式化显示XML的方法示例
Jan 22 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 curl基本操作详解
2013/07/23 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
php-msf源码详解
2017/12/25 PHP
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
javaScript中indexOf用法技巧
2019/11/26 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
JavaScript实现前端倒计时效果
2021/02/09 Javascript
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
2017/11/08 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
python和shell监控linux服务器的详细代码
2018/06/22 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
详解Django 时间与时区设置问题
2019/07/23 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
购房协议书范本
2014/04/11 职场文书
青春演讲稿范文
2014/05/08 职场文书
班级体育活动总结
2014/07/05 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
创业的9条正确思考方式
2019/08/26 职场文书