Я использую Zf 1.10 в проекте и до этого бита довольно успешно использовал Zend_Paginator вместе с запросами Zend_DbTable.
Для запроса требуется ключевое слово DISTINCT, чтобы удалить дублирующиеся строки, созданные соединением, нокогда я его добавляю, пагинатор неправильно отображает навигацию для двух страниц результатов, когда фактически есть только одна страница результатов.Некоторое копание показывает, что он выполняет два запроса: один для результирующего набора «Мне нужно» (77 строк), а другой - для подсчета.Но второй запрос, сгенерированный магией Zend, не включает ключевое слово DISTINCT, поэтому счетчик возвращает 112 строк вместо 77 строк.
Вот соответствующий бит
$select = $this->select()
->setIntegrityCheck(false)
->from('companies')
->distinct()
->join('project_team', 'companies.companyID = project_team.companyID', null)
->join('project_team_roles', 'project_team.roleID = project_team_roles.roleID', null)
->join('projects', 'projects.projectID = project_team.projectID', null)
->where('project_team_roles.isArchitect')
->where('companies.companyName LIKE ?', '%' . $str . '%')
->where('projects.islive AND NOT projects.isDeleted')
->order('companies.companyName');
$adapter = new Zend_Paginator_Adapter_DbTableSelect($select);
$paginator = new Zend_Paginator($adapter);
$paginator->setCurrentPageNumber($page);
$paginator->setItemCountPerPage(100);
return $paginator;
В этом нет ничего плохогос запросами, которые он генерирует, кроме игнорирования предложения DISTINCT в запросе count.Если вы удалите бит -> Different (), все получится великолепно - 112 строк и нумерация страниц все супер, за исключением того, что в данных есть повторяющиеся строки.
Я вижу, что сообщения об ошибках возвращаются к справедливым путям в отношении подобных проблем, ноони помечены как исправленные в более ранних версиях ZF
? Это известная ошибка?Могу ли я что-нибудь сделать, не написав свою собственную нумерацию страниц?Дело не в том, что написание нумерации страниц является особенно сложной задачей, но это означает, что этот бит будет непоследовательным для остальной части проектаопубликовано как ответ ниже.