lcavero / doctrine-paginator-bundle
分页DQL语句
Requires
- php: >=5.5.9
- doctrine/doctrine-bundle: ^1.6
- doctrine/orm: ^2.5
- incenteev/composer-parameter-handler: ^2.0
- symfony/polyfill-apcu: ^1.0
- symfony/symfony: ^3.0
Requires (Dev)
- sensio/generator-bundle: ^3.0
- symfony/phpunit-bridge: ^3.0
This package is auto-updated.
Last update: 2024-09-21 01:39:52 UTC
README
DoctrinePaginatorBundle 包允许您分页您的DQL语句。
它非常适合返回分页的数据集,包括搜索和过滤数据。
目录
安装
您可以使用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