lcavero/doctrine-paginator-bundle

分页DQL语句

安装: 528

依赖项: 0

建议者: 0

安全性: 0

星标: 4

关注者: 1

分支: 0

开放问题: 0

类型:symfony-bundle

dev-master / 1.0.x-dev 2019-06-11 11:31 UTC

This package is auto-updated.

Last update: 2024-09-21 01:39:52 UTC


README

DoctrinePaginatorBundle 包允许您分页您的DQL语句。
它非常适合返回分页的数据集,包括搜索和过滤数据。

目录

  1. 安装
  2. 基本用法
  3. 分页结果
  4. 搜索和过滤
    4.1 行为
    4.2 结构
    4.3 关联
    4.4 关联和ORDER BY
  5. 配置
    5.1 接受的布尔值
    5.2 严格模式

安装

您可以使用composer安装它

composer require lcavero/doctrine-paginator-bundle dev-master

然后向您的内核添加此包

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
            // ...

            new LCavero\DoctrinePaginatorBundle\DoctrinePaginatorBundle(),
        ];

        // ...
    }
}

此包有什么作用?

它将初始DQL语句转换为基于分页器和搜索选项的分页语句。

基本用法

use LCavero\DoctrinePaginatorBundle\Paginator\PaginatorOptions;

class MyController
{
    public function getUsersAction()
    {
        // Define the standard DQL sentence
        $dql = 'SELECT a FROM AppBundle:User WHERE a.age > 18'
        
        // Create the Query
        $query = $entity_manager->createQuery($dql);
        
        // Define paginator options (page, per_page, order, order_by, search, filters)
        $opts = new PaginatorOptions(4, 10, 'asc', 'id');
        
        // Paginate the data, this returns an array with the data and other interesting info
        $pagination = $container->get('lcav_doctrine_paginator')->paginate($query, $opts);
        
        // Now you have the users paginated and filtered, you can return them or do something amazing
        $users = $pagination['data'];
        
        // ..
    }
}

分页结果

调用 paginate 返回一些有趣的信息

  • data: 一个包含分页结果的数组
  • count: 总项目数(过滤但未分页)
  • current_page: 当前页
  • total_pages: 过滤结果的页数总数
  • per_page: 每页项目数

这些信息通常非常有兴趣在前端显示分页选项

搜索和过滤

行为

过滤器和搜索类似,但区别在于搜索是一组条件,其中至少有一个必须匹配,而每个过滤器都必须匹配。
您可以将它视为条件结构

    (STANDARD SENTENCE) AND (FILTER 1 AND FILTER 2) AND (SEARCH 1 OR SEARCH 2)
结构

搜索和过滤具有相同的结构,一个键为 => 值的数组。
键是实体字段名,值当然是值。

因此,如果您有以下实体

class User
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     */
    protected $email;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    protected $name;
    
    /**
     * @ORM\ManyToMany(targetEntity="Group", mappedBy="users")
     */
    private $groups;
    
    // ..
}

您可以创建,例如

    // Returns users which email contains lcavero or which name contains luis (or Luis, all search and filters are case insensitive)
    $search  = ['email' => 'lcavero', 'name' => 'Luis'];
    
    // Returns users which email contains roma and which name contains susana
    $filters = ['email' => 'roma', 'name' => 'Susana'];
    
    // Returns users which email contains maria and whitch name contains paula and can optionally contains jonh
    $search  = ['email' => 'maria', 'name' => 'Jonh'];
    $filters = ['name' => 'Paula'];
    
关联

好的,太棒了!但实体关联怎么办?这个 User 类与组有 多对多 关联,我想通过它们进行过滤!

好的,没问题,假设以下实体

class Group
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    protected $name;
    
    /**
     * @ORM\ManyToMany(targetEntity="User", inversedBy="groups")
     */
    private $users;
    // ..
}

如您所见,组可以通过字段 name 来表示,所以我想要通过组名进行过滤,并且用户有一个字段 groups 来实现关联。
所以 ... 如果您想要过滤那些组名为 GroupA 的用户,您应该这样做

    // You can do it also with search and order_by
    $filter = ['groups.name' => 'GroupA']

这就结束了!您可以用任何类型的关联(1-1,1-N,N-M ...)来做这件事。

关联和ORDER BY

您可以使用上述语法按关联字段排序,但不要忘记,您只能按 一对一多对一 关联排序。

配置

接受的布尔值

您可以定义接受的布尔值,这意味着默认情况下,如果您在布尔字段上搜索非布尔值,搜索将被忽略(DQL语句搜索-1值而不是0/1)。也许您想要定义自己的布尔值。

严格模式

您还可以启用/禁用 严格模式。默认情况下,如果您搜索 "Hello World",DQL语句将搜索单词 "Hello""World""Hello World",但您可以通过启用严格模式来禁用它。这意味着只有 "Hello World" 可以匹配。

# app/config/config.yml

lcavero_doctrine_paginator:
    mapping:
        boolean_true_values: [1, 'true']
        boolean_false_values: [0, 'false']
        
    search:
        strict_mode: false