doctrine-orm - 如何使用 Zend2/Doctrine 组合进行分页(使用 Doctrine 提供的分页器适配器)?

标签 doctrine-orm zend-framework2

我一直在寻找有关如何执行我要求的操作的示例/指南。

我找到了几个例子,我发现的“最好的”是这个=> http://blog.loftdigital.com/blog/doctrine-plus-zf2-tips-pagination

2 个问题

  1. 我不太确定我的分页器对象是否包含正确数量的记录(我在适配器对象上将其限制为 5 条记录)

  2. 我不知道如何遍历 View 文件中的分页器对象。看起来非常复杂。我在对象上执行了 print_r,将其包含在 pre HTML 标记中,并且在我的文本编辑器上轻松完成了 20+K 行(复制/粘贴后)

你能帮忙吗?

非常感谢


我的 Controller 代码基于示例(不是真正工作,但也没有 zend/doctrine 错误。问题是它给了我所有记录,而不是仅仅 10 条)

$directory->populate($form->getData());
$adapter = new DoctrineAdapter(new ORMPaginator($directoryDao->searchStaffDirectory($this->getEntityManager()->createQueryBuilder(), $directory)));
$adapter->getItems(0, 5);
//var_dump($adapter->getItems(0, 5)); **//display the corrent number of records**

$paginator = new Paginator($adapter);
$paginator->setDefaultItemCountPerPage(5);
$page = (int)$this->params()->fromQuery("page");
if($page) $paginator->setCurrentPageNumber($page);

return array('staffList' => $paginator);

我的 DirectoryDAO 类(相关部分)

public function searchStaffDirectory(QueryBuilder $queryBuilder, DirectoryModel $directory) {
    $conditions = new Andx;

    $queryBuilder
            ->select('directory')
            ->from('Directory\Model\DirectoryModel', 'directory');
    if (strlen($directory->surnameSearch)) {
         $conditions->add($queryBuilder->expr()->like('directory.surnameSearch', "'".preg_replace('/\s+/', '', $directory->surnameSearch)."%'"));
    }
    if (strlen($directory->surnameSoundsSearch)) {
         $conditions->add($queryBuilder->expr()->like('directory.surnameSoundsSearch', preg_replace('/\s+/', '', $directory->surnameSoundsSearch)));
    }
    if (strlen($directory->firstnameSearch)) {
         $conditions->add($queryBuilder->expr()->like('directory.firsnameSearch', preg_replace('/\s+/', '', $directory->firstnameSearch)));
    }
    if (strlen($directory->telephoneNumber)) {
         $conditions->add($queryBuilder->expr()->like('directory.telephoneNumber', preg_replace('/\s+/', '', $directory->telephoneNumber)));
    }
    if (strlen($directory->departmentSearch)) {
         $conditions->add($queryBuilder->expr()->like('directory.departmentSearch', preg_replace('/\s+/', '', $directory->departmentSearch)));
    }
    if (strlen($directory->roleSearch)) {
         $conditions->add($queryBuilder->expr()->like('directory.roleSearch', preg_replace('/\s+/', '', $directory->roleSearch)));
    }
    if ($conditions->count()) {
            $queryBuilder->andWhere($conditions);
    }
    $queryBuilder
            ->orderBy('directory.surname');

    return $queryBuilder->getQuery();
}

我的 DirectoryModel 类

<?php

namespace Directory\Model;

use Doctrine\ORM\Mapping;

use Zend\InputFilter\Factory;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

/**
 * @Mapping\Entity
 * @Mapping\Table(name="staffdirectory_vw")
 */
class DirectoryModel {
    /**
     * 
     * @Mapping\Id
     * @Mapping\Column(name="mytable_pk", type="integer", unique=true)
     */
    protected $pk;

    /**
     * 
     * @Mapping\Column(name="mytable_id", type="string")
     */
    protected $id;

    /**
     *
     * @Mapping\Column(name="mytable_parent_id", type="string")
     */
    protected $parentId;

    /**
     * 
     * @Mapping\Column(name="mytable_auth_code", type="string")
     */
    protected $fan;

    /**
     * 
     * @Mapping\Column(name="mytable_full_name", type="string")
     */
    protected $fullname;

    /**
     * 
     * @Mapping\Column(name="mytable_name_title", type="string")
     */
    protected $title;

    /**
     * 
     * @Mapping\Column(name="mytable_first_pref_name", type="string")
     */
    protected $firstname;

    /**
     * 
     * @Mapping\Column(name="mytable_surname", type="string")
     */
    protected $surname;

    /**
     * 
     * @Mapping\Column(name="mytable_bldg_long_desc", type="string")
     */
    protected $building;

    /**
     * 
     * @Mapping\Column(name="mytable_display_department", type="string")
     */
    protected $department;

    /**
     * 
     * @Mapping\Column(name="mytable_alias", type="string")
     */
    protected $email;

    /**
     * 
     * @Mapping\Column(name="mytable_alias_list", type="string")
     */
    protected $emailList;

    /**
     * 
     * @Mapping\Column(name="mytable_entity_type", type="string")
     */
    protected $entityType;

    /**
     * 
     * @Mapping\Column(name="mytable_org_heirarchy", type="string")
     */
    protected $organisationalHeirarchy;

    /**
     * 
     * @Mapping\Column(name="mytable_role", type="string")
     */
    protected $role;

    /**
     * 
     * @Mapping\Column(name="mytable_room", type="string")
     */
    protected $room;

    /**
     * 
     * @Mapping\Column(name="mytable_tele_number", type="string")
     */
    protected $telephoneNumber;

    /**
     * 
     * @Mapping\Column(name="mytable_tele_number_formats", type="string")
     */
    protected $telephoneNumberFormats;

    /**
     * 
     * @Mapping\Column(name="mytable_tele_rank", type="string")
     */
    protected $teleRank;

    /**
     * 
     * @Mapping\Column(name="mytable_url", type="string")
     */
    protected $url;

    /**
     * 
     * @Mapping\Column(name="mytable_search_surname", type="string")
     */
    protected $surnameSearch;

    /**
     * 
     * @Mapping\Column(name="mytable_surname_soundex", type="string")
     */
    protected $surnameSoundsSearch;

    /**
     * 
     * @Mapping\Column(name="mytable_search_first_name", type="string")
     */
    protected $firstnameSearch;

    /**
     * 
     * @Mapping\Column(name="mytable_search_department", type="string")
     */
    protected $departmentSearch;

    /**
     * 
     * @Mapping\Column(name="mytable_search_role", type="string")
     */
    protected $roleSearch;

    /**
     * 
     * @Mapping\Column(name="mytable_tele_directory", type="string")
     */
    protected $teleDirectory;

    protected $inputFilter;

    /**
     * Magic getter to expose protected properties.
     * 
     * @param string $property
     * @return mixed
     */
    public function __get($property) {
        return $this->$property;
    }

    /**
     * 
     * Magic setter to save protected properties.
     * 
     * @param string $property
     * @param mixed $value
     */
    public function __set($property, $value) {
        $this->$property = $value;
    }

    /**
     * Convert the object to an array.
     * 
     * @return array
     */
    public function getArrayCopy() {
        return get_object_vars($this);
    }

    /**
     * Populate from an array.
     * 
     * @param array $data
     */
    public function populate($data = array()) {
        $this->pk = isset($data['pk']) ? $data['pk'] : null;
        $this->id = isset($data['id']) ? $data['id'] : null;
        $this->fan = isset($data['fan']) ? $data['fan'] : null;
        $this->fullname = isset($data['fullname']) ? $data['fullname'] : null;
        $this->surname = isset($data['surname']) ? $data['surname'] : null;
        $this->building = isset($data['building']) ? $data['building'] : null;
        $this->department = isset($data['department']) ? $data['department'] : null;
        $this->email = isset($data['email']) ? $data['email'] : null;
        $this->emailList = isset($data['emailList']) ? $data['emailList'] : null;
        $this->entityType = isset($data['entityType']) ? $data['entityType'] : null;
        $this->organisationalHeirarchy = isset($data['organisationalHeirarchy']) ? $data['organisationalHeirarchy'] : null;
        $this->role = isset($data['role']) ? $data['role'] : null;
        $this->room = isset($data['room']) ? $data['room'] : null;
        $this->telephoneNumber = isset($data['telephoneNumber']) ? $data['telephoneNumber'] : null;
        $this->telephoneNumberFormats = isset($data['telephoneNumberFormats']) ? $data['telephoneNumberFormats'] : null;
        $this->teleRank = isset($data['teleRank']) ? $data['teleRank'] : null;
        $this->url = isset($data['url']) ? $data['url'] : null;
        $this->surnameSearch = isset($data['surnameSearch']) ? $data['surnameSearch'] : null;
        $this->surnameSoundsSearch = isset($data['surnameSoundsSearch']) ? $data['surnameSoundsSearch'] : null;
        $this->firstnameSearch = isset($data['firstnameSearch']) ? $data['firstnameSearch'] : null;
        $this->departmentSearch = isset($data['departmentSearch']) ? $data['departmentSearch'] : null;
        $this->roleSearch = isset($data['roleSearch']) ? $data['roleSearch'] : null;
        $this->teleDirectory = isset($data['teleDirectory']) ? $data['teleDirectory'] : null;
    }

    public function setInputFilter(InputFilterInterface $inputFilter) {
        throw new \Exception("Not used");
    }

    public function getInputFilter() {
        if (!$this->inputFilter) {
            $inputFilter = new InputFilter();
            $factory = new Factory();

            $inputFilter->add($factory->createInput(array(
                    'name'     => 'surnameSearch',
                    'required' => false,
                    'filters'  => array(
                            array('name' => 'StripTags'),
                            array('name' => 'StringToUpper'),
                            array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                            array(
                                    'name'    => 'StringLength',
                                    'options' => array(
                                            'encoding' => 'UTF-8',
                                            'min'      => 1,
                                            'max'      => 30,
                                    ),
                            ),
                    ),
            )));
            $inputFilter->add($factory->createInput(array(
                    'name'     => 'surnameSoundsSearch',
                    'required' => false,
                    'filters'  => array(
                            array('name' => 'StripTags'),
                            array('name' => 'StringToUpper'),
                            array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                            array(
                                    'name'    => 'StringLength',
                                    'options' => array(
                                            'encoding' => 'UTF-8',
                                            'min'      => 1,
                                            'max'      => 30,
                                    ),
                            ),
                    ),
            )));
            $inputFilter->add($factory->createInput(array(
                    'name'     => 'firstnameSearch',
                    'required' => false,
                    'filters'  => array(
                            array('name' => 'StripTags'),
                            array('name' => 'StringToUpper'),
                            array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                            array(
                                    'name'    => 'StringLength',
                                    'options' => array(
                                            'encoding' => 'UTF-8',
                                            'min'      => 1,
                                            'max'      => 30,
                                    ),
                            ),
                    ),
            )));
            $inputFilter->add($factory->createInput(array(
                    'name'     => 'telephoneNumberSearch',
                    'required' => false,
                    'filters'  => array(
                            array('name' => 'Int'),
                    ),
            )));
            $inputFilter->add($factory->createInput(array(
                    'name'     => 'departmentSearch',
                    'required' => false,
                    'filters'  => array(
                            array('name' => 'StripTags'),
                            array('name' => 'StringToUpper'),
                            array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                            array(
                                    'name'    => 'StringLength',
                                    'options' => array(
                                            'encoding' => 'UTF-8',
                                            'min'      => 1,
                                            'max'      => 30,
                                    ),
                            ),
                    ),
            )));
            $inputFilter->add($factory->createInput(array(
                    'name'     => 'roleeSearch',
                    'required' => false,
                    'filters'  => array(
                            array('name' => 'StripTags'),
                            array('name' => 'StringToUpper'),
                            array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                            array(
                                    'name'    => 'StringLength',
                                    'options' => array(
                                            'encoding' => 'UTF-8',
                                            'min'      => 1,
                                            'max'      => 30,
                                    ),
                            ),
                    ),
            )));

            $this->inputFilter = $inputFilter;
        }

        return $this->inputFilter;
    }
}

最佳答案

我假设 DoctrineAdapter 实际上是 DoctrineORMModule\Paginator\Adapter\DoctrinePaginator 只是您使用不同的名称导入了它。如果没有,那么这就是您应该使用的类。

您的 Controller 应该是:

$directory->populate($form->getData());
$adapter = new DoctrineAdapter(new ORMPaginator($directoryDao->searchStaffDirectory($this->getEntityManager()->createQueryBuilder(), $directory)));

$paginator = new Paginator($adapter);
$paginator->setItemCountPerPage(5);
$page = (int)$this->params()->fromQuery("page");
$paginator->setCurrentPageNumber($page);

return array('staffList' => $paginator);

无需调用getItems,当您将$page转换为int时,如果没有传递page参数,它将自动默认为第一页。

在 View 中使用分页器更为复杂。首先,您需要实现一个呈现分页器的 View 脚本。 ZF2 文档中有许多示例脚本,您可以直接使用它们,也可以基于您自己的分页器:

http://framework.zend.com/manual/2.2/en/modules/zend.paginator.usage.html#example-pagination-controls

要在实际 View 中使用分页器,您可以像任何其他查询结果一样迭代它来显示您的项目:

<?php foreach($staffList as $staff): ?>

    Firstname: <?php echo $staff->firstname; ?>

    etc.

<?php endforeach; ?>

这只会显示分页器当前所在页面的当前项目,这正是您想要的。

显示分页器控件:

<?php echo $this->paginationControl($staffList, '<paginator type>', '<my paginator view script>', array('route' => '<route name>')); ?>

分页器类型可以是:全部、弹性、跳跃、滑动,并确定分页器控件上显示的页码方式和内容。滑动是默认设置,而且很可能是最佳选择。

关于doctrine-orm - 如何使用 Zend2/Doctrine 组合进行分页(使用 Doctrine 提供的分页器适配器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17358323/

相关文章:

php - 如何在 symfony2 Controller 中迭代 ArrayCollection

php - 想要在ZF2中使用一种形式插入两个表

php - ZF2 Zend\Log + Doctrine2

php - Zend Framework 2 获取多行

php - ZF2 - 子查询

mongodb - Symfony2 和 MongoDB 注释/映射无法识别

security - Symfony2 : Injecting @security. 获取当前用户的上下文。如何避免 "ServiceCircularReferenceException"?注入(inject)整个容器?

symfony - 在 Doctrine 2 中更新(从反面)双向多对多关系?

symfony - 使用 FOSUserBundle 与基于 yml 的实体相关

mysql - 在 ZF2 中以 utf-8 格式从数据库中检索数据