Laravel Eloquent分表方法并使用模型关联的实现
发布:smiling 来源: PHP粉丝网 添加日期:2022-01-24 14:03:31 浏览: 评论:0
众所周知 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);
- }
- }
Tags: Laravel分表方法 Eloquent
- 上一篇:使用Git实现Laravel项目的自动化部署
- 下一篇:最后一页
相关文章
- ·Laravel 5框架学习之Eloquent 关系(2021-05-22)
- ·laravel 数据迁移与 Eloquent ORM的实现方法(2021-11-16)
- ·Laravel5.7 Eloquent ORM快速入门详解(2021-11-16)
- ·Laravel Eloquent ORM 多条件查询的例子(2021-12-28)
- ·Laravel Eloquent ORM 实现查询表中指定的字段(2022-01-08)
- ·使用laravel的Eloquent模型如何获取数据库的指定列(2022-01-08)
- ·laravel 之 Eloquent 模型修改器和序列化示例(2022-01-08)
- ·laravel5 Eloquent 实现事务方式(2022-01-14)
- ·laravel 解决Eloquent ORM的save方法无法插入数据的问题(2022-01-14)
- ·Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()(2022-01-16)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)