rulerz-php/doctrine-orm

RulerZ 的 Doctrine ORM 编译目标

dev-master 2020-01-03 14:08 UTC

This package is auto-updated.

Last update: 2024-08-29 04:37:46 UTC


README

RulerZ 的 Doctrine ORM 编译目标。

用法

Doctrine ORM 是 RulerZ 支持的目标之一。

本指南将向您展示如何使用 Doctrine 和 RulerZ 获取对象。

以下是您需要执行的步骤摘要

配置 Doctrine ORM

本主题将不会在此直接处理。您可以选择遵循 官方文档 或使用您所使用的框架推荐的包/模块/等。

配置 RulerZ

一旦 Doctrine 安装并配置完毕,我们就可以配置 RulerZ 引擎。

$rulerz = new RulerZ(
    $compiler, [
        new \RulerZ\DoctrineORM\Target\DoctrineORM(), // this line is Doctrine-specific
        // other compilation targets...
    ]
);

唯一的与 Doctrine 相关的配置是将 DoctrineQueryBuilder 目标添加到已知编译目标列表中。

过滤目标

现在 Doctrine 和 RulerZ 都已准备就绪,您可以使用它们来获取数据。

我们之前注入到 RulerZ 引擎中的 DoctrineQueryBuilder 实例只知道如何使用 QueryBuilder,因此第一步是创建一个

$playersQueryBuilder = $entityManager
    ->createQueryBuilder()
    ->select('p')
    ->from(Entity\Player::class, 'p');

像往常一样,我们使用我们的目标(QueryBuilder 对象)和规则调用 RulerZ。RulerZ 将为给定的目标构建正确的执行器,并使用它来过滤数据,在我们的情况下是从数据库中检索数据。

$rule  = 'gender = :gender and points > :points';
$parameters = [
    'points' => 30,
    'gender' => 'M',
];

var_dump($rulerz->filter($playersQueryBuilder, $rule, $parameters));

处理连接

通常,您的实体将与您的应用程序中的其他实体有关联。

让我们假设我们的 Entity\Player 实体与 Entity\Group 实体有一个 1-1 的关联,并且我们想要检索属于具有角色 ROLE_ADMIN 的组的所有玩家。

使用该关联有两种编写规则的方法。在第一种方法中,我们让 RulerZ 自动确定如何连接实体

$playersQueryBuilder = $entityManager
    ->createQueryBuilder()
    ->select('p')
    ->from(Entity\Player::class, 'p');

$rule = '"ROLE_ADMIN" IN group.roles';

var_dump(
    iterator_to_array($rulerz->filter($playersQueryBuilder, $rule))
);

重要的是要注意,group 不是一个普通属性:它是一个另一个实体,由 RulerZ 连接。

注意: RulerZ 将在查询构建器上调用 join() 方法,因此它将默认执行内部连接。

如果您需要更多控制连接的处理方式,我们可以准备查询构建器并自行连接所需的实体

$playersQueryBuilder = $entityManager
    ->createQueryBuilder()
    ->select('p')
    ->from('Entity\Player', 'p')
    ->innerJoin('Entity\Group', 'g');

$rule = '"ROLE_ADMIN" IN g.roles';

var_dump(
    iterator_to_array($rulerz->filter($playersQueryBuilder, $rule))
);

这次,RulerZ 足够聪明,能够理解 g 可能是一个已连接的实体,并且它不应尝试自己连接它。

许可

本库采用 MIT 许可。