2013-02-25 2 views
1

Я хочу использовать ограничение и смещение в моем запросе, но количество возвращенных записей не совпадает. Когда я не использует смещение и предельная функция получает 26 объектов, и после того, устанавливающей методыDoctrine2 OFFSET и LIMIT

->setMaxResults(5) 
->setFirstResult(10) 

число составляет 1 ... Что происходит?

+0

Вы присоединяетесь к другим столам? –

+0

Да '$ д = $ 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

+0

Вы должны учитывать соединения при ограничении строк. –

ответ

7

Что вы, вероятно, типичная проблема, которую вы получаете, когда fetch-joining в DQL. Это очень простая проблема и вытекает из того факта, что смещение и предел применяются к набору результатов, который еще не гидратирован и должен быть нормализован (см. documentation about first and max results about that).

Если вы хотите избежать проблемы (даже при более сложных соединенных или полученных с помощью соединения результатах), вам нужно будет использовать ORM DQL Paginator API. Использование Paginator в основном вызывает множественные запросы:

  1. вычислить число записей в результирующем согласно смещенному/пределу
  2. вычислить различные идентификаторы корневой сущности вашего запроса (с приложенным максом/первыми результатами)
  3. извлекать присоединился результаты (без применяемых первых/макс результатов)

Его использование является довольно прост:

$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.

Смежные вопросы