#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
я не могу фильтровать статус.