Zend Paginator проблема - PullRequest
       10

Zend Paginator проблема

1 голос
/ 06 октября 2009

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

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

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

Ответы [ 2 ]

8 голосов
/ 06 октября 2009

Если ваш запрос действительно настолько сложен, что вы не можете использовать 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));
1 голос
/ 06 октября 2009

Вы можете использовать подзапросы в БД, например:

    $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' ) );

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

...