是否可以在 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' }
我使用 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' }