ThinkPHP的远程一对一或者一对多关联
Mr.Cookie Lv1

ThinkPHP的开发文档说的比较模糊

hasOneThrough(‘关联模型’, ‘中间模型’, ‘外键’, ‘中间表关联键’,’当前模型主键’,’中间模型主键’);

  • 关联模型(必须):关联模型类名
  • 中间模型(必须):中间模型类名
  • 外键:默认的外键名规则是当前模型名+_id
  • 中间表关联键:默认的中间表关联键名的规则是中间模型名+_id
  • 前模型主键:一般会自动获取也可以指定传入
  • 间模型主键:一般会自动获取也可以指定传入

我们以实际开发过程中来举例

  • BuffetModel
    自助订单表,记录了桌号,订单类型,订单状态等信息
  • OrderModel
    系统订单表,记录 金额,支付状态等信息
  • OrderExtBuffet
    系统订单自助扩展表,也就是第三方关联表,通过order_id(系统订单) buffer_order_id(自助订单)来确定关联关系

其中BuffetModel可能会包含一个或者多个系统订单,如中途加人等.这时候我们可以在BuffetModel远程一对多关联OrderModel,在查询的时候处理多个订单信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class BuffetOrderModel extends Model{
protected $name = 'buffet_orders';
protected $autoWriteTimestamp = true;
use SoftDelete;

public function orderList(){
return $this->hasManyThrough(
OrderModel::class, // 最终关联的模型
OrderExtBuffet::class, // 中间表模型
'buffet_orders_id', // 中间表与主表关联字段
'id', // 关联模型被关联的字段
'id', // 主模型被关联的字段
'order_id' // 中间表与关联模型的关联字段
);
}
}