具有关系的变量在返回期间发生变化

时间:2019-03-19 12:44:11

标签: php laravel return

我用Laravel。 我的帖子和评论之间有关系。 我有$post,我想只将值$comments设置为published来获得相关的true。 在控制器中,我有:

$post     = Post::find($id);
$comments = $post->comments->where('published', 1)->get();

这里的变量comments看起来正确,但是当我这样做时:

return [
    'comments' => $comments,
    'post'     => $post,
];

我有来自db的所有评论,并通过一个数组将帖子与评论连接在一起。 例如

$post: 
id  24
title   "lorem"
body  "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis explicabo molestias obcaecati placeat vero. Alias aliquid consectetur, deserunt ducimus iure magnam minus molestias neque pariatur quidem sint temporibus totam vitae."
user_id 2
published   1
created_at  "2018-12-03 12:14:30"
updated_at  "2019-03-29 10:08:26"
comments    [
    1 [ ... ]
    2 [ ... ]
    n [ ... ] 
]

$comments {
 1 [ ... ]
 2 [ ... ]
 n [ ... ] 
}

那我在哪里弄错了?为什么会改变?

模型Comment.php

public function post()
{
    return $this->belongsTo(Post::class);
}

public function scopePublished($query)
{
    return $query->where('published', 1);
}

Post.php

public function comments()
{
    return $this->hasMany(Comment::class);
}

2 个答案:

答案 0 :(得分:1)

尝试一下

$post     = Post::with(['comments' => function($q) {
                     $q->where('published', 1); // or $q->published();
                 }])
                ->find($id);

您可以阅读Where with relationship

在刀片文件中,您可以使用来获取帖子和评论

{{ dd($post) }} //get post
{{ dd($post->comments) }} //get post related commnets 

答案 1 :(得分:0)

$comments = $post->comments->where('published', 1)->get();

检查发布的设置为1的帖子。 要获取任何帖子的已发布评论,请在您的Post.php中添加新关系,如下所示:

public function publishedComments()
{
    return $this->comments()->where('published', 1);
}

然后您可以像这样在控制器中使用它

$comments = $post->publishedComments()->get();