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” 字段。

来自广州的漂流瓶
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《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');
}]);

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

4年前 评论
讨论数量: 3

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

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

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

4年前 评论
mantou_1 4年前

实践结果证明无法统一 select

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

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

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

然后

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

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

4年前 评论

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