Невозможно получить большое количество результатов с помощью Doctrine и paginator.Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Невозможно получить большое количество результатов с помощью Doctrine и paginator.

Сообщение Anonymous »

Итак, я совершенно не понимаю, что-то в моем коде не работает, и я не знаю, что и почему. Вот в чем проблема:Я извлекаю результаты из базы данных, чтобы показать, что имеется в наличии. У меня есть две части: публичная и управленческая. Проблема в том, что у меня нет одинаковых результатов, хотя код почти идентичен:
Репозиторий:

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

public function findAllLimit(int $page, $onglet, $filtre = "", array $auts = [], int $limit = 25):array
{
$tirage = ['tirage', 'tirages-anciens'];
$objets = ['objet', 'jeu', 'figurine'];

$result = []; $listId = [];
$query = $this->createQueryBuilder('p')
->leftJoin('p.auteurs', 'a')
->leftJoin('p.dessinateurs', 'd')
->innerJoin('p.editeur', 'e')
->innerJoin('p.serie', 's')
->innerJoin('p.paratype', 't')
->andWhere('p.active = :etat')
->setParameter('etat', true);
if($filtre != ""){
$query->andWhere('p.parabd_titre LIKE :f OR a.nom LIKE :f OR a.prenom LIKE :f OR d.nom LIKE :f OR d.prenom LIKE :f OR e.nom LIKE :f')
->setParameter('f', "%".$filtre."%");
}

if($onglet == 'tintin'){
$query->andWhere("s.nom = 'tintin'");
} elseif($onglet == 'affiche'){
$query->andWhere("s.nom != 'tintin'")
->andWhere("t.nom = 'affiche' ");
} elseif($onglet == 'tirages'){
$query->andWhere("s.nom != 'tintin'")
->andWhere("t.nom IN (:tirage) ")
->setParameter('tirage', $tirage);
} elseif($onglet == 'objets'){
$query->andWhere("s.nom != 'tintin'")
->andWhere("t.nom IN (:objet) ")
->setParameter('objet', $objets);
} elseif($onglet != '') {
$query->andWhere("s.nom != 'tintin'")
->andWhere('t.nom = :type ')
->setParameter('type', $onglet);
}

if(count($auts) > 0) {
foreach($auts as $a) { array_push($listId, $a->getId()); }
$query->andWhere('a.id IN (:ids) OR d.id IN (:ids)')
->setParameter('ids', $listId);
}

$query->orderBy('p.position', 'ASC')
->setMaxResults($limit)
->setFirstResult($page * $limit - $limit);

$paginator = new Paginator($query);
//    dd($paginator->getQuery()->getSQL());
$data = $paginator->getQuery()->getResult();
//    dd($paginator->count());

if(empty($data)) { //retourne tableau vide pour éviter les erreurs 500
$result['data'] = [];
$result['pages'] = 0;
return $result;
}

//Calcul nb de pages
$pages = ceil($paginator->count() / $limit);

$result['data'] = $data;
$result['pages'] = $pages;
$result['page'] = $page;
$result['limit'] = $limit;

return $result;
}
На странице:

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

{% block body %}
Ex-Libris
{% set path = 'lib_xl' %}
{% set pages = liste.pages %}
{% set currentPage = liste.page %}
{% set haveFilter = true %}
{% set filtre = nomFilt %}
{% set btnList = true %}
{% include "_partials/_pagination.html.twig" %}

{% set n = 0 %}
{% for l in liste.data %}
{% set n = n+1 %}

 {{ l.etatLibris.libelle|upper }} 
{{ l.livre }} [/b]

{% set i = 0 %}{% set n = l.dessinateurs|length + l.auteurs|length %} {% for a in l.dessinateurs %}{% set i = i+1 %} {{ a.prenom }} {{a.nom}}{% if i > n-1 %} {% elseif i == n - 1 %} et {% else %}, {% endif %} {% endfor %}
{% for a in l.auteurs %}{% set i = i+1 %} {{ a.prenom }} {{a.nom}}{% if i > n-1 %} {% elseif i == n - 1 %} et {% else %}, {% endif %} {% endfor %}

[img]{{ asset([/img]

paru aux éditions {{ l.editeur.nom }}
en {{ l.date|format_datetime(pattern='MMMM yyyy', locale='fr') }}

{{ l.commentaire }}


[list]{% for bd in l.bdconcernes %}
[*][url={{ bd.lien }}]{{ bd.nombd }}[/url]
{% endfor %}
[/list]


{% endfor %}

{% include "_partials/_pagination.html.twig" %}
Что касается части управления, код почти идентичен, как я уже сказал (в общедоступном коде есть только одна строка, которая блокирует все неактивные объекты (p.active) (ни один из них не деактивирован, поэтому мы можем игнорировать это) и порядок отличается (по номеру позиционирования, но все имеют значение 0, так что...)).
Дело в том, что у меня есть 18 объектов, которые должны отображаться (SQL и Paginator дают 18 объектов), но только 14 встали. Почему?
Изменить: проблема устранена добавлением ->select('DISTINCT p') после '$this->createQueryBuilder('p')'. Спасибо Джулиану Костеру!

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

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

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

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

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

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