在使用 ThinkPHP8 进行模型关联查询优化时,可以考虑以下几个步骤:
- 使用模型关联定义替代手动 join:如果已经在模型中定义了关联,则可以通过关联方法简化代码,提高可读性和维护性。
- 参数验证与处理:对输入参数进行更严格的检查和处理,确保数据安全性和减少不必要的错误。
- 查询条件的优化:使用动态构建查询条件的方式,使代码更加简洁和灵活。
- 利用 with 方法预加载关联数据:通过预加载来优化 N+1 查询问题,提升性能。
下面是根据上述原则优化的示例:
首先,确保你的模型中定义了关联。假设 ServerOs
模型和 ServerOsCategory
模型之间存在 belongsTo
关联,并且已经在 ServerOs
模型中定义了这样的关联:
class ServerOs extends Model
{
// 假设与 ServerOsCategory 的关联名为 category
public function category()
{
return $this->belongsTo(ServerOsCategory::class, 'category_id', 'id');
}
}
接下来是优化后的 getList
方法:
use think\facade\Db;
public static function getList($param)
{
$limit = isset($param['limit']) ? (int)$param['limit'] : 10;
// 构建查询条件数组,使用更简洁的方式
$where = [];
if (!empty($param['title'])) {
$where[] = ['O.title', 'like', "%" . $param['title'] . "%"];
}
if (!empty($param['name'])) {
$where[] = ['O.name', 'like', "%" . $param['name'] . "%"];
}
if (isset($param['status'])) {
$where[] = ['O.status', '=', $param['status']];
}
// 使用模型关联的预加载优化查询
// 避免使用 leftJoin, 直接通过关联名 'category' 进行加载
return self::with('category')
->where($where)
->order('O.id desc')
->paginate($limit);
}
改进点:
- 使用了
with
方法预加载关联的ServerOsCategory
数据,避免了在列表查询中为每个ServerOs
对象单独查询其分类信息的性能问题。 - 去掉了
leftJoin
并且没有直接在 SQL 中引用外部表,提高了代码的可读性和维护性。 - 对参数的检查更加严格,简化了条件构建的逻辑。
这种方式利用了 ThinkPHP 的 Eloquent ORM 功能,使得代码更加简洁和符合面向对象的原则。同时,也更好地利用了框架提供的性能优化特性。