Что вы, вероятно, типичная проблема, которую вы получаете, когда fetch-joining в DQL. Это очень простая проблема и вытекает из того факта, что смещение и предел применяются к набору результатов, который еще не гидратирован и должен быть нормализован (см. documentation about first and max results about that).
Если вы хотите избежать проблемы (даже при более сложных соединенных или полученных с помощью соединения результатах), вам нужно будет использовать ORM DQL Paginator API. Использование Paginator в основном вызывает множественные запросы:
- вычислить число записей в результирующем согласно смещенному/пределу
- вычислить различные идентификаторы корневой сущности вашего запроса (с приложенным максом/первыми результатами)
- извлекать присоединился результаты (без применяемых первых/макс результатов)
Его использование является довольно прост:
$query = $em->crateQuery($fetchJoinQuery);
$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
$query->setFirstResult(20);
$query->setMaxResults(100);
foreach ($paginator as $result) {
var_dump($result->getId());
}
Это будет печатать 100 предметов, начиная с единицы в смещении 20, независимо от количества объединенных или полученных с помощью выборки результатов.
Хотя это может показаться неработоспособным, это самый безопасный способ справиться с проблемой результатов, связанных с извлечением, вызвавших, по-видимому, скремблированные смещения и ограничения в результатах. Вы можете посмотреть, как это происходит непосредственно, погрузившись в internals of the ORM Paginator.
Вы присоединяетесь к другим столам? –
Да '$ д = $ em-> createQueryBuilder() \t \t -> выберите ('а, тт') \t \t -> из ('MyBackendBundle: Ad', 'а') \t \t -> LeftJoin ('a.transactionType', 'тт') \t \t -> LeftJoin ('a.propertyType', 'пт') \t \t -> LeftJoin ('a.place', 'р') \t \t -> LeftJoin ('a.pictures', 'pic') \t \t -> где ('tt.name LIKE: transactionType') \t \t -> andWhere ("pt.name LIKE: propertyType"); ' – leebake
Вы должны учитывать соединения при ограничении строк. –