morphTo关联获取多模型时,如何设置每种模型指定select的字段?

假设有三个表
posts

字段 类型
id int
title varchar(64)
created_at timestamp

threads

字段 类型
id int
content text
created_at timestamp

comments

字段 类型
id int
target_type varchar(64)
target_id int
content text
created_at timestamp

按照文档 Comment 模型写上

public function target()
{
    return $this->morphTo();
}

当我获取评论列表并且预加载 target

$comments->loadMissing(['target']);

我的问题就是如何指定字段,比如 targetPost 时,只选择 “id”, “title” 字段,targetThread 时,只选择 “id”, “content” 字段。

来自广州的漂流瓶
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

实践结果证明无法统一 select

$comments->loadMissing(['target' => function ($q) {
    $q->select(...);
}]);

但是我们可以使用查询作用域来实现, 在不同模型上统一定义同名查询作用域,然后分别实现自己的 select 字段

public function scopeMySelect($query)
{
   $q->select(...);
}

然后

$comments->loadMissing(['target' => function ($q) {
    $q->scopes('mySelect');
}]);

这样就可以实现问题提到的效果

2年前 评论
讨论数量: 3

morphTo后面直接跟链式我记得是可以的。。

2年前 评论
mantou_1 (作者) 2年前
mantou_1 (作者) 2年前

@mantou_1 关键是morphTo是根据不同表得到,不同表字段命名都不一样,统一select肯定报错啊。。

2年前 评论
mantou_1 2年前

实践结果证明无法统一 select

$comments->loadMissing(['target' => function ($q) {
    $q->select(...);
}]);

但是我们可以使用查询作用域来实现, 在不同模型上统一定义同名查询作用域,然后分别实现自己的 select 字段

public function scopeMySelect($query)
{
   $q->select(...);
}

然后

$comments->loadMissing(['target' => function ($q) {
    $q->scopes('mySelect');
}]);

这样就可以实现问题提到的效果

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!