PHP中关联预加载WITH的用法

在A表中需要通过外键查询B表关联的数据时,可以在A表中添加获取器

<?php
namespace app\model;

use think\Model;

class User extends Model 
{
    //以get开头,Attr结尾,中间为在进行查询时获取的字段
    public function getStatusAttr($value)
    {
        $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
        return $status[$value];
    }
}

 在查询代码中,就可以使用append()方法追加查询的外表数据

$ExaminationPaper = ExaminationPaper::where($this->where())
    ->field('id,name,cid,sort,create_time,subject_category_id,topic_count,total_score')
    ->append(['status'])
    ->limit($this->limitOffset, $this->limitLength)
    ->order($this->sortOrder)
    ->select()
    ->toArray();
return $ExaminationPaper;

但此方法在查询时,执行的是N+1的查询次数,所以在实际情况中,查询的速度非常慢,此时,就可以使用with()方法,通过预加载的方式,大大减少查询时间,解决N+1此的查询问题

1、WITH()方法

在使用此方法前,需要在Model类中建立好对应的关联关系,例如:

(1)

public function examinationTopic():HasMany
{
    //一对多的关系:对应的类型,外键,本地关联的键
    return $this->hasMany(ExaminationTopic::class, 'examination_paper_id', 'id');
}

(2) 

public function examinationPaperCategory():HasOne
{
    //一对一的关系:对应的类型,外键,本地关联的键
    return $this->hasOne(ExaminationPaperCategory::class, 'id', 'cid');
}

在模型中设置好关联的表后,就可以使用with()方法,在查询A表时预加载B表的数据了

$result = ExaminationPaper::where(['id'=>$params['id']])
    ->withoutField("update_time,delete_time")
    //预加载题目信息
    ->with([
        'examinationTopic' => function ($query)
        {
        $query->field('id,name,score,type,answer,examination_paper_id');
       }
    ])
    ->findOrEmpty()
    ->toArray();
return $result;

此方法可大大减少查询时间,主要还是解决N+1次数查询的问题

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值