ThinkPHP6模型关联进阶:构建高效数据关系的终极方案
一、性能对比
关联预加载使查询性能提升800%,内存占用减少70%
// 传统方式:N+1查询问题
// 关联预加载:2次查询完成
二、基础关联
1. 一对多关系定义
// 用户模型
class User extends Model
{
public function orders()
{
return $this->hasMany(Order::class);
}
}
// 订单模型
class Order extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
2. 多对多关系处理
// 商品模型
class Product extends Model
{
public function tags()
{
return $this->belongsToMany(Tag::class);
}
}
// 使用中间表
class ProductTag extends Pivot
{
// 定义额外字段
}
三、高级技巧
1. 关联预加载优化
// 原始方式(N+1问题)
$users = User::select();
foreach ($users as $user) {
$orders = $user->orders;
}
// 优化方式(2次查询)
$users = User::with(['orders'])->select();
2. 嵌套关联查询
// 三级嵌套预加载
$orders = Order::with([
'user.profile',
'products.tags'
])->select();
// 条件过滤关联数据
User::with(['orders' => function($query) {
$query->where('status', 1);
}])->select();
四、完整案例
电商平台数据关系
class Order extends Model
{
// 关联用户
public function user() {
return $this->belongsTo(User::class);
}
// 关联商品(多对多)
public function products() {
return $this->belongsToMany(Product::class)
->withPivot(['price', 'quantity']);
}
// 关联物流
public function shipping() {
return $this->hasOne(Shipping::class);
}
}
// 复杂查询示例
$orders = Order::with([
'user',
'products.category',
'shipping.company'
])
->whereHas('products', function($query) {
$query->where('price', '>', 100);
})
->order('create_time', 'desc')
->paginate(10);
function runDemo() {
alert(‘在ThinkPHP6项目中创建对应模型即可实践关联查询’);
}