У меня есть таблица оценок и объект App\Entity\Score. Таблица имеет идентификатор, значение, user_id, созданный_at и обновленный_at. Таблица пользователей имеет идентификатор, имя, созданные_at и обновленные_at.
Код: Выделить всё
#[ORM\Entity(repositoryClass: ScoreRepository::class)]
#[ORM\HasLifecycleCallbacks]
class Score extends BaseEntity implements JsonSerializable
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column]
private ?int $value = null;
#[ORM\ManyToOne(inversedBy: 'scores')]
#[ORM\JoinColumn(nullable: false)]
private ?User $user = null;
/** other methods */
}
Код: Выделить всё
$qb = $this->createQueryBuilder('s');
$subquery = $this->createQueryBuilder('b')
->select('MAX(b.id)')
->where(
'b.value = (
SELECT MAX(a.value)
FROM App\Entity\Score a
WHERE a.user = b.user
)'
)
->groupBy('b.user')
->getDQL();
$qb
->select('s')
->orderBy('s.value', 'DESC')
->where($qb->expr()->in('s.id', $subquery))
->setMaxResults($perPage)
->setFirstResult(($page - 1) * $perPage);
Код: Выделить всё
(new Paginator($qb))->getIterator();
Код: Выделить всё
SELECT DISTINCT id_0
FROM ( SELECT DISTINCT id_0, value_1
FROM ( SELECT s0_.id AS id_0,
s0_.value AS value_1,
s0_.created_at AS created_at_2,
s0_.updated_at AS updated_at_3,
s1_.id AS id_4,
s1_.value AS value_5,
s1_.created_at AS created_at_6,
s1_.updated_at AS updated_at_7
FROM score s0_
WHERE s0_.id IN ( SELECT MAX(s1_.id) AS sclr_8
FROM score s1_
WHERE s1_.value =
( SELECT MAX(s2_.value) AS sclr_9 FROM score s2_ WHERE s2_.user_id = s1_.user_id )
GROUP BY s1_.user_id ) ) dctrn_result_inner
ORDER BY value_1 DESC ) dctrn_result
LIMIT 10;
Код: Выделить всё
dd($qb->getQuery()->getSQL());
Код: Выделить всё
SELECT s0_.id AS id_0,
s0_.value AS value_1,
s0_.created_at AS created_at_2,
s0_.updated_at AS updated_at_3,
s0_.user_id AS user_id_4
FROM score s0_
WHERE s0_.id IN ( SELECT MAX(s1_.id) AS sclr_5
FROM score s1_
WHERE s1_.value = ( SELECT MAX(s2_.value) AS sclr_6 FROM score s2_ WHERE s2_.user_id = s1_.user_id )
GROUP BY s1_.user_id )
ORDER BY s0_.value DESC
LIMIT 10;
Подробнее здесь: https://stackoverflow.com/questions/790 ... d-doctrine
Мобильная версия