在ThinkPHP5中实现模型关联查询需先定义关系类型,再通过with()预加载等方法调用,否则关联数据不会自动加载;belongsTo适用于“文章属于作者”,hasMany适用于“用户有多篇文章”,外键名必须与数据库字段完全一致。

在ThinkPHP5中实现模型关联查询,需要先定义好模型之间的关系类型(如一对一、一对多、多对多),再通过特定方法调用关联数据,否则直接使用select()或find()只会查出主表字段,关联表数据不会自动加载。
定义belongsTo(属于)关联
适用于“文章属于作者”这类场景:文章表有author_id字段,需关联查出作者信息。
在Article模型类中,添加getAuthorAttr方法并声明belongsTo关联:
public function author()
{
return $this->belongsTo('User', 'author_id', 'id');
}
注意:第二个参数是外键名(当前模型中的字段),第三个参数是关联模型的主键名,默认为'id',若被关联模型主键不是id必须显式传入。
定义hasMany(一对多)关联
适用于“用户有多篇文章”的反向关系。
在User模型中定义:
public function articles()
{
return $this->hasMany('Article', 'author_id', 'id');
}
这一步写错会导致with()预载时查不到数据——【外键名必须与Article表中实际字段名完全一致】,比如数据库里字段叫user_id就不能写author_id。
执行关联查询
方法一:使用with()预加载(推荐,避免N+1查询)
$articles = Article::with('author')->select();
此时每条文章数据的author属性会是一个User模型实例,可直接访问$user->name。
方法二:延迟加载(不推荐用于列表页)
$article = Article::find(1);
echo $article->author->name; // 第一次访问时才触发查询
方法三:关联条件过滤(例如只查已发布的文章)
$articles = User::with(['articles' => function ($query) {
$query->where('status', 1);
select();
多级关联嵌套查询
第一步:确保各级关联方法已正确定义,比如Article → author → profile(用户资料)。
第二步:在Author模型中定义profile关联:
public function profile()
{
return $this->hasOne('Profile', 'user_id');
}
第三步:一次性加载两级关联:
$articles = Article::with(['author.profile'])->select();
此时$article->author->profile可直接取值,无需额外查询。
第四步:若某级关联可能为空(如用户没填资料),访问前务必判空,否则会抛出异常。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











