如何使用不同的whenLoaded关系添加相同的数组键?

时间:2019-05-22 00:11:00

标签: php laravel relationship

here中,我想将关系数据放入我的API资源中。

使用一个键和一个关系,它可以正常工作。 但是,使用两个不同键和两个相同关系,就不会。

我的目标是:

  • 如果加载了x关系,则将此数据用作键“ a”。
  • 如果加载了y关系,则将此数据用作键“ a”。

我尝试了什么

  1. 带有一个名为“ comments”的键的“ P​​ost”对象,当加载“ comments”关系时。 (有效)

  2. 带有两个键“ comments”和“ comments”的“ Post”对象。当加载“评论”关系时创建第一个“评论”,当加载“ comments_by_tag”关系时创建第二个“评论”。

然后,我以“评论”关系加载“发布”(失败)。 并加载“ comments_by_tag”关系(有效)。

  1. “发布”对象,带有两个键分别为“ comments”和“ comments”。现在,我更改第二个“ comments”为第一个,第一个“ comments”为第二个的位置。

然后,我以“评论”关系加载“帖子”(有效)。 并加载“ comments_by_tag”关系(失败)。

这是我在

上的代码
return [
  'comments' => CommentItem::collection($this->whenLoaded('comments')),
  'comments' => CommentItem::collection($this->whenLoaded('comments_by_tag')),
];

2 个答案:

答案 0 :(得分:0)

只需检查whenLoaded方法的值。

如果没有加载的关系,

whenLoaded方法将返回null。

if ($comments = $this->whenLoaded('comments')) {
    return ['comments' => $comments]
} else if ($commentsByTag = $this->whenLoaded('comments_by_tag')) {
    return ['comments' => $commentsByTag];
}

答案 1 :(得分:0)

不那么优雅,但是可以满足您的需求。 ->relationLoaded(relationName)检查是否已加载。

return [
    'comments' => $this->when(
        $this->relationLoaded('comments') 
        || $this->relationLoaded('comments_by_tag'),
        function () {
            return CommentItem::collection(
                $this->relationLoaded('comments')
                    ? $this->comments
                    : $this->comments_by_tag
            );
        }
    ), 
];