学习笔记:thinkphp8 的模型关联查询功能

2024-05-12 605 0

在使用 ThinkPHP8 进行模型关联查询优化时,可以考虑以下几个步骤:

  1. 使用模型关联定义替代手动 join:如果已经在模型中定义了关联,则可以通过关联方法简化代码,提高可读性和维护性。
  2. 参数验证与处理:对输入参数进行更严格的检查和处理,确保数据安全性和减少不必要的错误。
  3. 查询条件的优化:使用动态构建查询条件的方式,使代码更加简洁和灵活。
  4. 利用 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 功能,使得代码更加简洁和符合面向对象的原则。同时,也更好地利用了框架提供的性能优化特性。

    相关文章

    TP6的路由怎么实现?我写一个简单教程。
    Thinkphp8安装topthink/think-captcha验证码的和使用方法
    php 取当月有多少天 然后返回整数的方法
    php计算两个日期之间相隔的天数
    在 ThinkPHP8 中,选择使用 findOrEmpty() 还是 find() 取决于你对结果处理的需求
    php获取用户操作系统

    发布评论