переменные с отношениями меняются во время возврата - PullRequest
0 голосов
/ 19 марта 2019

Я использую Laravel. У меня есть отношения между постом и комментариями. У меня есть $post, и я хотел бы связать $comments только со значением published, установленным на true. В контроллере у меня есть:

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

А вот переменная comments выглядит правильно, но когда я делаю:

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

У меня есть все комментарии из базы данных и сообщения, соединяющиеся с комментариями в одном массиве. * 1012 например *

$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 ]

1 голос
/ 19 марта 2019

Попробуйте это

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

Вы можете прочитать Где с отношениями

В блейд-файле вы можете получить пост и комментарии, используя

{{ dd($post) }} //get post
{{ dd($post->comments) }} //get post related commnets 
0 голосов
/ 19 марта 2019
$comments = $post->comments->where('published', 1)->get();

проверяет сообщений , которые опубликовали значение 1. Чтобы получить опубликованные комментарии к любому сообщению, добавьте новое отношение в свой Post.php следующим образом:

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

Затем вы можете использовать его в своем контроллере следующим образом:

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