проблема с зенд пагинатором

Я хочу использовать Zend Paginator в своем проекте с необработанным запросом sql (не Dbselect). Я не могу использовать Dbselect, потому что у меня есть несколько подзапросов в основном запросе sql. Из руководства я обнаружил, что единственный способ - использовать нумерацию страниц в результирующем массиве, подобном этому

$paginator = Zend_Paginator::factory($array);

но у меня много записей в запросе, и мне это кажется плохой идеей. Есть ли способ решить эту проблему?


person mik    schedule 06.10.2009    source источник


Ответы (2)


Если ваш запрос действительно настолько сложен, что вы не можете использовать Zend_Db_Select, вы можете прибегнуть к написанию собственного Zend_Paginator_Adapter, который представляет собой не так сложно, как может показаться.

Ваш соответствующий класс должен реализовывать только Zend_Paginator_Adapter_Interface, чтобы вы могли передать класс в конструктор Zend_Paginator.

Ниже приведен простой пример - вы можете взять его за отправную точку...

class App_Model_ListOfItems implements Zend_Paginator_Adapter_Interface
{
    /**
     * @var Zend_Db_Adapter_Abstract
     */
    protected $_db;

    /**
     * @param Zend_Db_Adapter_Abstract $db
     */
    public function __construct(Zend_Db_Adapter_Abstract $db)
    {
        $this->_db = $db;
    }

    /**
     * @implements Zend_Paginator_Adapter_Interface
     * @return integer
     */
    public function count()
    {
        return (int)$this->_db->fetchOne('SELECT COUNT(*) FROM <<add your query to determine the total row count here>>');
    }

    /**
     * @implements Zend_Paginator_Adapter_Interface
     * @param  integer $offset
     * @param  integer $itemCountPerPage
     * @return array
     */
    public function getItems($offset, $itemCountPerPage)
    {
        $sql = 'SELECT <<add your columns, tables, joins and subqueries as needed>> LIMIT ' . 
            (int)$offset . ', ' . (int)$itemCountPerPage;
        return $this->_db->fetchAll($sql);
    }
}

$paginator = new Zend_Paginator(new App_Model_ListOfItems($db));
person Stefan Gehrig    schedule 06.10.2009

Вы можете использовать подзапросы в db select следующим образом:

    $select = $this->_db->select();
    $select->from( 'customer', array( 'id', 'first_name', 'family_name', 'company', 'phone', 'email' ) );
    $select->joinLeft( 'sale', 'customer.id = sale.customer_id and sale.id in (select max( id ) from sale group by customer_id)', array( 'sale_id' => 'id', 'billing_phone', 'shipping_phone', 'billing_city', 'billing_country', 'created_on' ) );

(Приведенный выше запрос возвращает имя клиента, а также контактную информацию о его последней покупке.)

person Steve    schedule 06.10.2009