Как получить последнее сообщение из тем с несколькими полями? - PullRequest
0 голосов
/ 22 сентября 2019

В моем приложении Laravel 5.8 / mysql5 я получаю последние сообщения из тем вроде

$forumThreads= ForumThread
    ::getByForumId($forum_id)
    ->select(
        'forum_threads.*',
        \DB::raw(' ( select count('.$prefix.'forum_posts.id) from '.$prefix.'forum_posts where '.$prefix.'forum_posts.forum_thread_id = '.$prefix.'forum_threads.id ) as forum_posts_count'),
        \DB::raw(' ( select created_at from '.$prefix.'forum_posts where '.$prefix.'forum_posts.forum_thread_id = '.$prefix.'forum_threads.id  order by id desc limit 1) as latest_post_created_at')
    )
    ->orderBy($order_by, $order_direction)
    ->offset($limit_start)
    ->take($forum_threads_per_page)
    ->get();

Все работает нормально, но мне нужно получить несколько полей для последней записи.Если я изменяю условие следующим образом:

\DB::raw(' ( select created_at, title, slug from '.$prefix.'forum_posts where 

Я получаю ошибку:

Cardinality violation: 1241 Operand should contain 1 column(s)

Есть способ?

модифицированный блок: Вapp / ForumThread.php Я создал

  public function latestForumPost()
    {
        return $this->hasOne('App\ForumPost')->latest();
    }

    public function forumPosts()
    {
        return $this->hasMany('App\ForumPost');

    }

и под моим контролем я делаю:

  $forumThreads= ForumThread::with('latestForumPost')->withCount('forumPosts')
                              ->getByForumId($forum_id)
                              ->orderBy($order_by, $order_direction)
                              ->offset($limit_start)
                              ->take($forum_threads_per_page)
                              ->get();

    foreach( $forumThreads as $next_key=>$nextForumThread ) {
        $nextForumThread->latest_post_created_at= $nextForumThread->latestForumPost->created_at;
    }

и это работает!Но когда я пытаюсь использовать $ nextForumThread-> latestForumPost в моем файле blade.php:

<tr v-for="nextForumThread, index in forumThreads" :key="nextForumThread.id">
    nextForumThread.latestForumPost::{{ nextForumThread.latestForumPost}}

Это не работает.Можно ли использовать в шаблоне лезвия?

1 Ответ

1 голос
/ 22 сентября 2019

Вы можете достичь этого с помощью простых отношений.

// ForumThread model
public function latestPost()
{
  return $this->hasOne('Post')->latest();
}

public function posts()
{
  return $this->hasMany('Post');
}

Теперь мы будем использовать отношения latestPost для получения сведений о последних публикациях по категориям и posts для подсчета.

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

$forumThreads= ForumThread::with('latestPost')->withCount('posts')
    ->getByForumId($forum_id)
    ->orderBy($order_by, $order_direction)
    ->offset($limit_start)
    ->take($forum_threads_per_page)
    ->get();

Вы можете получить доступ к этим данным следующим образом:

foreach ($forumThreads as $thread) {
    echo $thread->posts_count;    -- to show posts counts per thread.
    echo $thread->latestPost->id;  -- to access any field from latestPost
}

Ссылка:

Подсчет связанных моделей

Тонкая настройка Laravel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...