как получить все комментарии с заголовком их сообщения, связанные с таблицей сообщений в laravel?

#php #laravel #eloquent

#php #ларавель #красноречивый

Вопрос:

Таблица комментариев

  ---- --------- ------ ------ -------- ----------- 
| id | post_id | name | text | status | timestamp |
 ---- --------- ------ ------ -------- ----------- 
|  1 |      52 | user | test |      1 | timestamp |
 ---- --------- ------ ------ -------- ----------- 
 

Публикации

  ---- -------- ------------------ ----------- 
| id | title  |   description    | timestamp |
 ---- -------- ------------------ ----------- 
| 52 | mypost | post description | timestamp |
 ---- -------- ------------------ ----------- 
 

Commnet.php [Модель laravel]

 public function post()
{
    return $this->belongsTo('AppPost');
}
 

Post.php [Модель laravel]

 public function comments()
{
    return $this->hasMany('AppComment');
}
 

Я хочу перечислить все комментарии с заголовком поста.
Как я могу собрать заголовок сообщения, включенный в коллекцию комментариев?

Я не хочу использовать DB::table(); Я хочу, чтобы он был собран с помощью модели комментариев. вот так $comments = Comment::all()->post->title;

Комментарии:

1. используйте $comments = Comment::with('post')->get()

2. мне нужно только значение заголовка из таблицы post, как мне этого добиться?

Ответ №1:

Пример 1

Обычно запрос выглядит так (документы laravel):

 $comments = Comment::with('post')->all();  
 

Использование подобных данных выглядит следующим образом:

 foreach($comments as $comment) {
    $comment->name;
    $comment->text;
    $comment->post->title;
}
 

Пример 2

Если вы хотите, чтобы результат был «плоским», вы также можете сделать что-то вроде этого (laravel docs):

 $comments = Comment::select('comments.*', 'posts.title')->join('posts', 'post.id', 'comments.post_id')->get()
 

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

 foreach($comments as $comment) {
    $comment->name;
    $comment->text;
    $comment->title;
}
 

Пример 3

Увидев ваш комментарий под вашим ответом позже, я понял, какой запрос вы могли искать:

 $postTitles = Post::select('title')->whereHas('comments')->get()->pluck('title');
 

Это вернет коллекцию заголовков сообщений, будут показаны только заголовки сообщений, в которых есть комментарии.

Пример 4

Основываясь на ваших последних комментариях, я могу показать вам, как фильтровать комментарии в сообщении (laravel docs):

  $post = Post
        ::with([
            'category',
            'comments' => function($query) {
                $query->where('status_id', 1);
            },
            'user'
        ])
        -where('slug', $slug)
        ->first();
 

Теперь вы получаете первое сообщение, связанное с slug, и вместе с ним все данные пользователя, все сведения о категории, но только комментарии, которые имеют status_id 1

Комментарии:

1. как мне сделать то же самое с одним запросом?

2. @ANOLGHOSH Вы можете уточнить? 2-й пример — это один запрос, а первый приведет к 2 запросам за кулисами, но все равно будет эффективным. Вам нужен только список заголовков сообщений? Потому что тогда запрос может быть другим.

3. $comment = Comment::with('post')->findorFail($id); это для запроса одного комментария; это работает. и все ваши примеры верны, спасибо. Но я хотел бы знать. как мне добавить where status = 1 в этот $comments = Post::find($post->id)->comments; запрос?

4. ах, это четкий запрос 🙂 Позвольте мне обновить пример 4 — это статус сообщения или комментария?

5. $comments = Post::find($post->id)->comments->where('status',1); это работает, но это невозможно использовать, поскольку $post = Post::with('category', 'comments', 'user')->where('slug', $slug)->first(); этот запрос возвращает все комментарии к сообщению. но $post я не могу фильтровать статус.