Пагинация для максимального количества запросов на группу с использованием Symfony и DoctrinePhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Пагинация для максимального количества запросов на группу с использованием Symfony и Doctrine

Сообщение Anonymous »

Мне нужно получить наилучшие результаты с разбивкой на страницы для всех пользователей, но у меня проблема с разбиением на страницы.
У меня есть таблица оценок и объект 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);
Этот код неверен, поскольку он генерирует запрос с бессмысленным статусом выбора, когда я использую paginator.

Код: Выделить всё

(new Paginator($qb))->getIterator();
Ошибка: при выполнении запроса произошло исключение: SQLSTATE[42S22]: столбец не найден: 1054 Неизвестный столбец «s1_.id» в «списке полей»

Код: Выделить всё

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;
Но если я получу необработанный SQL-запрос из того же запроса, SQL-запрос будет правильным.

Код: Выделить всё

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;
Как мне исправить построитель запросов, чтобы он мог работать с пагинатором? Есть ли у вас примеры кода, в которых используется нумерация страниц Doctrine и наибольшее n на группу?


Подробнее здесь: https://stackoverflow.com/questions/790 ... d-doctrine
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»