Сортировка PersistentCollection по свойству внутри PersistentCollection - PullRequest
0 голосов
/ 09 января 2019

У меня есть 3 объекта: категория, тема и сообщение. В категории есть OneToMany с темой, а в теме есть OneToMany с темой.

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

// CategoryController.php
public function read($slug)
{
    $category = $this->getDoctrine()
        ->getRepository(Category::class)
        ->findBySlug($slug);

    $threads = $category->getThreads();
}

// CategoryRepository.php
public function findBySlug($slug): ?Category
{
    return $this->createQueryBuilder('c')
        ->andWhere('c.slug = :val')
        ->setParameter('val', $slug)
        ->getQuery()
        ->getOneOrNullResult();
}

Я безуспешно пытался добиться этого с innerJoin и orderBy. Это также не работает:

$iterator = $threads->getIterator();

$iterator->uasort(function ($a, $b) {
        return ($a->getPosts()->getValues()->getCreatedAt() > $b->getPosts()->getValues()->getCreatedAt()) ? -1 : 1;
    });

Что было бы наиболее эффективным решением для базы данных? Спасибо

1 Ответ

0 голосов
/ 09 января 2019

Может быть, это может помочь вам, я думаю, вы должны начать с сущности темы.

//ThreadRepository
public function gethreadsByCategorySortedByPost($slug)
{
    $qb = $this->createQueryBuilder('th')
        ->innerJoin('th.category', 'c', Expr\Join::WITH, 'c.slug  = :slug')
        ->leftJoin('th.post', 'p')
        ->orderBy('p.createdAt', 'desc');

    return $qb->getQuery()->getResult();
}

Тогда:

$this->getRepository(Thread::class)->gethreadsByCategorySortedByPost($slug);
...