2010-10-09 7 views
3

Я использую Zf 1.10 в проекте и очень успешно использовал Zend_Paginator вместе с запросами Zend_DbTable до этого бита.Zend Paginator отображает неправильный счет страницы, когда запрос имеет «отличный»

Запрос требует ключевого слова 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 положения в запросе счета. Если вы удаляете бит -> distinct(), все работает отлично - 112 строк и разбиение на страницы - все супер, за исключением того, что данные имеют повторяющиеся строки.

Я вижу сообщения об ошибках, уходящих справедливые способы о подобных вопросах, но они помечены как фиксированные в более ранних версиях ZF

? Является ли это известный глюк? Есть ли что-нибудь, что я могу с этим поделать, не написав свою собственную разбивку на страницы. Это не значит, что написание нумерация страницы является особенно сложной задачей, но это означает, что этот бит будет несовместимым с остальной частью проекта

Большого спасибо

Ian

EDIT - Найден обходным путем, отправил в ответ ниже.

ответ

0

Нашли простой обходной путь ... Не используйте DbTable адаптер, но получить результаты в массив, а затем передать, что для постраничной навигации

$results = $this->fetchAll($select)->toArray(); 
$adapter = new Zend_Paginator_Adapter_Array($results); 

Это только DbTable, что есть эта ошибка, это кажется.

Удачи!

+2

Тогда вы запрашиваете ALL результат и сохранить их в массиве не очень эффективно – Chris

2

Об этом было задано давно, но ему все еще нужен ответ.

Вы должны использовать методы setRowCount() в вашем контроллере.

$select = $your_model->getSelect(); 
$select_count = $your_model->getCount(); // geting count from select above 
$adapter = new Zend_Paginator_Adapter_DbSelect($select); 
$adapter->setRowCount((int)trim($select_count)); // <-- // set integer ! 
$paginator = new Zend_Paginator($adapter); 
// That's it 
... 

$this->view->paginator = $paginator; 
// and so on... 
+0

привет - спасибо за это - в следующий раз я обновляю этот проект, я постараюсь это. Продвиньтесь, чтобы взять на себя труд ответить на такой старый вопрос – Polsonby

+0

Что мы можем сделать, чтобы решить эту проблему в социальном движке? – Varada

+0

Необходимо выполнить то, что написано выше ... – tasmaniski