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

来自广州的漂流瓶
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

实践结果证明无法统一 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年前 评论

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