是否可以在 EasyAdmin 中通过角色(JSON 数组)过滤用户?

Is it possible to filter the user through roles (a JSON array) in EasyAdmin?

我使用 EasyadminBundle 作为 Symfony 应用程序的后端。

我想通过 $roles 过滤我的用户,其中 1 个 table 仅 ROLE_WEBMASTER,另一个 ROLE_ADMIN,最后一个 ROLE_ADMIN宽松者(ROLE_USER)。

不幸的是 User class 的 $roles 成员是一个数组。

class User implements UserInterface
{
    /**
     * @ORM\Column(type="json")
     */
    private $roles = [];
}

我的存储后端是 SQLite。

我尝试了两种解决方案:

1。使用搜索查询

- { icon: user-tie, label: admin, entity: User, params: {action: search, query: ROLE_ADMIN}}

do nothing

2。使用 DQL 过滤器

webmaster:
    class: App\Entity\User
    label: Webmaster
    list:
        dql_filter: "'ROLE_WEBMASTER' IN entity.sqlRoles()"

public function  sqlRoles():string
{
    return implode(', ',$this->getRoles());
}

但是它启动了以下错误

An exception has been thrown during the rendering of a template ("[Syntax Error] line 0, col 65: Error: Expected =, <, <=, <>, >, >=, !=, got 'IN'").


有没有办法执行这种技巧,或者我需要忘记这个想法吗?

我不知道 easyAdmin,但 DQL 不会计算。

dql_filter: "'ROLE_WEBMASTER' IN entity.sqlRoles()"

您需要记住,您在 DQL 上编写的任何内容最终都必须被翻译成普通的旧 SQL。这意味着使用实体方法是行不通的。

想一想:这些方法在对象被实例化后才能使用,after被检索后才能被实例化,而检索发生只有在SQL语句时是运行,所以此时不​​能进行WHERE过滤

问题是,使用香草 Doctrine,您将无法根据 JSON 属性 的 属性 的内容进行过滤,基本上使用 JSON_CONTAINS,哪个 Doctrine不包括支持。

然而,并不是所有的希望都破灭了。有一些扩展可以为不同的后端添加对这些功能的支持,like this one

如果安装并启用它,您可以将 DQL 过滤器更改为:

dql_filter: "JSON_CONTAINS(entity.roles, '\"ROLE_WEBMASTER\"', '$')"

只要你稍微摆弄一下,把所有东西都绑在一起,这应该会奏效。

遗憾的是,由于您使用的是 SQLite,因此您将无法使用上述内容。 SQLite 非常适合开发和嵌入式使用,但它的功能不如完全成熟的 RDBMS。

为了在EasyadminBundle中过滤一个JSON数组,结果发现不需要使用dql_filter作为filters 已经内置在捆绑包中。

首先您需要在实体描述中做一些准备工作:

easy_admin:
    entities:
        User:
            class: App\Entity\User
            list:
                filters:
                    - { property: roles, type: array }

由于过滤器现在已在实体上设置,我们可以在菜单中找到它:

easy_admin:
    design:
        menu:
            - { icon: user-cog, label: webmaser, entity: User, params: { action: list, filters: { roles: { comparison: like, value: [ROLE_WEBMASTER] } } } }

这是使用 dql_filter 对我有用的解决方案,希望对您有所帮助:

easy_admin:
    entities:
        Player:
          class: App\Entity\User
          list:
            dql_filter: "entity.roles LIKE '%%ROLE_PLAYER%%'"
        Admin:
          class: App\Entity\User
          list:
            dql_filter: "entity.roles LIKE '%%ROLE_ADMIN%%'"

easy_admin:
  design:
    menu:
      - { label: 'Users' }
      - { entity: 'Player', label: 'Players', icon: 'users' }
      - { entity: 'Admin', label: 'Admins', icon: 'users' }