5

したがって、私が zend paginate の作業を見る方法は、次のようにすることです。

$paginator = Zend_Paginator::factory($results);
$paginator->setItemCountPerPage($itemCount);
$paginator->setPageRange($pageRange);

$results は、データベースから一連のアイテムを次の形式でロードした結果です。

"SELECT * FROM table WHERE etc"

次に、 zend paginate は結果の数をカウントし、ページ範囲を自動的に生成します...

しかし、これを行うと、データベースのすべての結果を取得する必要があり、一度に 1 ページしか表示されないため、そのページのアイテムのみを取得する必要があるため、無駄だと思います...

テーブル全体のすべての結果を取得することに頼ることなく、正しいページ範囲と番号を計算できるように zend paginate を作成するにはどうすればよいですか?

4

5 に答える 5

4

ファクトリメソッドを使用すると、Zend_Db_SelectまたはZend_Db_Table_Selectのインスタンスを送信できます。クラスがZend_Db_Table_Abstractを拡張している場合は、そこからselectクエリを作成して、これを送信するだけです。そうでない場合は、インスタンスを作成して送信できます。ドキュメントの例を参照してください。

    $adapter = new Zend_Paginator_Adapter_DbSelect($db->select()->from('posts'));
    $adapter->setRowCount(
        $db->select()
           ->from(
                'item_counts',
                array(
                   Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN => 'post_count'
                )
             )
    );

$paginator = new Zend_Paginator($adapter)

http://framework.zend.com/manual/en/zend.paginator.usage.html#zend.paginator.usage.dbselect

于 2010-11-11T17:46:13.473 に答える
0

Zend_Db_Select と Zend_Db_Table_Select は、私がわずか 6 か月前に対処しなければならなかった問題を解決する優れた方法です。

データベースに本のテーブルがあり、テーブルのフィールド全体で全文検索を実行できるように検索関数を定義したとします。

Default_Model_DbTable_Books.php:

public class Default_Model_DbTable_Books extends Zend_Db_Table_Abstract {

    // Other variables and methods here...

    public function search($query) {
        // Initialize Zend_Db_Table_Select object
        $select = $this->select(true);

        if (isset($query) && is_string($query)) {
            // Logic for search (don't actually do this, it's horrible for performance)
            $db = $this->getAdapter();
            $where = $db->quoteInto('isbn LIKE ? OR name LIKE ? OR author LIKE ?', $query);
            $search->where($where)
                   ->order('date_published DESC')
                   ->group('author');
        }

        return $select;
    }
}

Default_Model_Mapper_Book.php:

public class Default_Model_Mapper_Book {

    // Defined functions as per Zend Quickstart Mapper classes...

    public function search($query) {
        // Returns Zend_Db_Table_Select object
        return $this->getDbTable()->search($query);
    }
}

Default_BooksController.php:

public function listAction() {
    $mapper = new Default_Model_Mapper_Book();
    $select = $mapper->search($this->_getParam("query"));
    $paginator = Zend_Paginator::factory($select);
}
于 2010-11-19T21:01:14.473 に答える
0

使用するアダプターによって異なります。を使用するZend_Paginator_Adapter_Arrayと、zend paginator は配列の長さによってページ範囲などを計算します。ただし、を使用するZend_Paginator_Adapter_DbSelectと、zend paginator はクエリselect count(*) ...... as zend_paginator_row_countに基づいてクエリを自動的に作成し、行数を計算しますが、データベースのすべての結果が読み込まれるわけではありません。

于 2010-11-12T04:56:07.673 に答える
0

zend paginator を別の方法で使用する必要があります。関数のドキュメントを参照してください。「DbSelect および DbTableSelect アダプター」セクションに移動すると、すべてのレコードをフェッチする代わりに、レコード数を選択する方法の例が示されています。

于 2010-11-11T17:44:31.253 に答える
0

これをZend_Paginator自分で行う必要がありますが、これは非常に簡単です。クエリを次の形式に変更します。SELECT * FROM table WHERE etc LIMIT 0, 30たとえば、この場合、最初の 30 行を取得し、次に取得する場合は次を使用します。SELECT * FROM table WHERE etc LIMIT 30, 60

言い換えれば、フレームワークを取得する関数は常に最適ではなく、複雑さを実装するのに最も簡単な作業で動作するため、最速のソリューションを使用するには、より厳密な使用コードを使用する必要があるためです (多くの場合、このコードを使用できないことを意味します)最悪の複雑さのコード)、ソリューションは問題に専念しています。このように、あなたは専念しmysqlPaginatorデータベース層では機能しません。入力がすべての行である入力に基づいてのみ機能します。このコードはこれをより速く行うことはできません。

于 2010-11-11T17:41:01.133 に答える