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

来自广州的漂流瓶
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

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

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