espier
  • 介绍
  • 技术说明
  • 系统部署
    • 准备工作
      • 域名
      • 七牛
      • 微信开放平台第三方平台申请
      • 域名备案
      • 服务器方案
      • 腾讯位置服务
      • 小程序
      • EcshopX初始化
    • 部署方案
      • 单机部署方案
      • 集群部署方案
  • 框架
    • 文档说明
    • 入门指南
      • 开发环境搭建
        • docker环境
        • 本地环境
      • composer
      • 目录结构
    • 架构思想
      • 中大型项目架构
      • Repository
      • Service
    • Bundle
      • 请求
        • 路由
        • 控制器
      • 数据库
        • 快速入门
        • Repository
        • CRUD Repository
      • 事件系统
      • 消息队列
    • 规范
      • 说明
      • 关于「能愿动词」的使用
      • 代码规范
        • 基本代码规范
        • 编码风格规范
      • Bundle 规范
        • 命名规范
    • 调试
    • 环境变量及配置
  • 快速入门
  • 运维
    • 压力测试报告
      • 5机集群
  • API文档
  • 数据辞典
  • 数据库migration规则
Powered by GitBook
On this page
  • DBALCrudRepository
  • ORMCrudRepository
  • DoctrineArrayFilter
  • 支持结构
  • 支持操作符

Was this helpful?

  1. 框架
  2. Bundle
  3. 数据库

CRUD Repository

为提高开发速度,降低代码重复率,新增 2 个 CURD Trait :DBALCrudRepository 和 ORMCrudRepository。

在 Doctrine ORM 中 ORM 依赖于 DBAL 层。ORM 调用 DBAL 并将 DBAL 返回的数组结构转化为对象。由于多了这一层转化,开发人员在使用时,可以根据使用场景和项目规模决定使用哪个Trait。

两者都是基于 Doctrine 提供的 QueryBuilder实现,不同的是:

  • DBALCrudRepository 基于 SQL Query Builder (Doctrine\DBAL\Query\QueryBuilder)

  • ORMCrudRepository 基于 DQL Query Builder(Doctrine\ORM\QueryBuilder)

DBALCrudRepository

DBALCrudRepository 基于 SQL Query Builder (Doctrine\DBAL\Query\QueryBuilder),其结果返回为数组,性能比ORMCrudRepository 略高。

trait DBALCrudRepository{
    public function save(array &$data)
    public function create(array &$data) {
    public function batchUpdate(array $filter, array $data)
    public function batchDelete(array $filter)
    public function count(array $filter=[])
    public function getList($cols='*', array $filter=[], $page = 1, $pageSize = 100, $orderBy = [])
}

使用方法如下:

<?php
namespace ItemBundle\Repositories;

use ItemBundle\Entities\ItemType;
use Doctrine\ORM\EntityRepository;
use EspierBundle\Traits\DBALCrudRepository;

class ItemTypeRepository extends EntityRepository
{
    use DBALCrudRepository;
}

ORMCrudRepository

ORMCrudRepository 基于 DQL Query Builder(Doctrine\ORM\QueryBuilder)

public function save($entity)
public function delete($entity)
public function create(array $data) {
public function batchUpdate(array $filter, array $data)
public function batchDelete(array $filter)
public function count(array $filter=[])
public function getList(array $filter=[], $page = 1, $pageSize = 100, $orderBy = [])

ORMCrudRepository 与 DBALCrudRepository 不同是 save 和 delete 方法,其输入为实体类,而不是数组。

使用方法如下:

<?php
namespace ItemBundle\Repositories;

use ItemBundle\Entities\ItemType;
use Doctrine\ORM\EntityRepository;
use EspierBundle\Traits\ORMCrudRepository;
class ItemTypeRepository extends EntityRepository
{
    use ORMCrudRepository;
}

DoctrineArrayFilter

为了兼容现有代码和大家在 ECOS 中的使用习惯,在batchUpdate、batchDelete、count和getList中的 filter数组统一由 DoctrineArrayFilter 来解析。除支持 字段|操作符 外,还支持多层嵌套的 OR 和 AND 结构。

支持结构

and

$filter = [
    'name|eq'=>'100',
    'name|neq'=>'100',
    'name|lt'=>'100',
    'name|lte'=>'100',
    'name|gt'=>'100',
    'name|gte'=>'100',
    'name|isNull'=>'',
    'name|isNotNull'=>'',
    'name|like'=>'%bar%',
    'name|notLike'=>'%foo',
    'name|in'=>[100,1000],
    'name|notIn'=>[1100,200],
];

生成where 条件如下:

(name = '100') AND (name <> '100') AND (name < '100') AND (name <= '100') AND (name > '100') AND (name >= '100') AND (name IS NULL) AND (name IS NOT NULL) AND (name LIKE '%bar%') AND (name NOT LIKE '%foo') AND (name IN ('100', '1000')) AND (name NOT IN ('1100', '200'))

OR

    $filter = [
        'OR'=>[
            'name_or_or'=>1000,
            'name_or_or2'=>1000,
        ],
    ];

生成where 条件如下:

(name_or_or = '1000') OR (name_or_or2 = '1000')

多层嵌套

$filter1 = [
    'AND'=>[
        'name_and1|like'=>'zhang',
        'name_and2|isNull'=>'',
        'OR'=>[
            'name_or1|in'=>[100,2020],
            'name_or2|notIn'=>[100,2020],
            'AND'=>[
                'name_or_or'=>1000,
                'name_or_or2'=>1000,
            ],
        ],
    ],
    'OR'=>[
        'name_or1|in'=>[100,2020],
        'name_or2|notIn'=>[100,2020],
        'AND'=>[
            'name_or_or'=>1000,
            'name_or_or2'=>1000,
        ],
    ],        
];

生成where 条件如下:

 ((name_and1 LIKE 'zhang') AND (name_and2 IS NULL) AND ((name_or1 IN ('100', '2020')) OR (name_or2 NOT IN ('100', '2020')) OR ((name_or_or = '1000') AND (name_or_or2 = '1000')))) AND ((name_or1 IN ('100', '2020')) OR (name_or2 NOT IN ('100', '2020')) OR ((name_or_or = '1000') AND (name_or_or2 = '1000')))

支持操作符

操作符

数据库含义

eq

=

neq

<>

lt

<

lte

<=

gt

>

gte

>=

in

in

notIn

not in

isNull

name IS NULL

isNotNull

name IS NOT NULL

like

LIKE

notLike

NOT LIKE

PreviousRepositoryNext事件系统

Last updated 5 years ago

Was this helpful?