Laravel 水平表分表查询支持with

需求是这样的有一个订单库,订单表都是按年进行的水平分表
如:订单主表:order、order_2021、
订单商品表:order_gooods、order_goods_2021
这是目前我GET到的处理方式,不知道有其它更好的处理方式,望各位指教

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class OrderDbModel extends Model
{
    //设置静态表后缀
    protected static $suffix= null;

    public function getTable()
    {
        return  parent::getTable().(static::$suffix ? '_'.static::$suffix : '');
    }

    public function setSuffix($tableSuffix='')
    {
        static::$suffix = null;
        if(!is_null($tableSuffix) && $tableSuffix && !empty($tableSuffix)){
            static::$suffix = $tableSuffix;
        }
        return $this;
    }

    public static function setTableSuffix($suffix){
        $instance = new static;
        $instance->setSuffix($suffix);
        return $instance->newQuery();
    }
}

订单相关的模型集成该模型,不再继承Illuminate\Database\Eloquent\Model
订单模型

namespace App\Models;

use Illuminate\Http\Request;

class Order extends OrderDbModel
{
    protected $table = 'order';
    protected $primaryKey = 'order_id';

    function order_goods(){
        return $this->hasOne(OrderGoods::class,'order_id');
    }

    function scopeSearchQuery($query,Request $request){
        $query->whereHas('order_goods',function($query) use($request){
            $query->where('sku_id','=','10000');
        });
    }

    function scopeGetItems($query,Request $request){
        $items = $query->whth(['order_goods'])->orderBy('order_id','desc')
            ->paginate(15);
        return $items;
    }

}

订单商品模型

namespace App\Models;

use Illuminate\Http\Request;

class Order extends OrderDbModel
{
    protected $table = 'order_goods';

}

获取订单模型

namespace App\Http\Controllers;


use App\Models\Order;
use Illuminate\Http\Request;

class OrderController extends Controller
{
    function index(Request $request){

        $year = $request->input('query_year') ?? date('Y');
        $items = Order::setTableSuffix('2021')->SearchQuery($request)->GetItems($request);

    }
}

现在这样的处理方式是可以解决分表查询的问题,但是表的后缀只能在调用Order模型之前设置好,不能再作用域内去设定,如果不是所有的表都是水平分表就不好处理了,灵活性不高
不知道有没有其它的更好的处理方案

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2
2年前 评论
jackven (楼主) 2年前
探索者 (作者) 2年前
jackven (楼主) 2年前

水平分表,需要查跨年的怎么处理?

2年前 评论
jackven (楼主) 2年前
PHPer技术栈 2年前
jackven (楼主) 2年前
PHPer技术栈 2年前
jackven (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!