在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次数查询的问题