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模型之前设置好,不能再作用域内去设定,如果不是所有的表都是水平分表就不好处理了,灵活性不高
不知道有没有其它的更好的处理方案
可以看这个 博客:利用orm 在业务代码无感知下,实现实现分库分表 对上层调用无任何影响
水平分表,需要查跨年的怎么处理?