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

2024-05-12 889 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 功能,使得代码更加简洁和符合面向对象的原则。同时,也更好地利用了框架提供的性能优化特性。

    相关文章

    织音云上新香港Platinum 8358处理器性能怪兽,爆炸高配折后最低仅需32元/月,数据对标物理机
    2025年华纳云新年焕新季,香港云4H4G3M特惠696元/年,E5物理服务器688元/月起
    莱卡云:2025年1月香港云服务器、美国云服务器、日本云服务器促销活动
    ThinkPHP6多应用多语言切换,最佳解决方案
    thinkphp thinkphp6 安装JWT
    php使用ip-api根据ip地扯获取位置信息

    发布评论