postgresql - 如何在查询生成器中使用 NOT LIKE?
问题描述
我正在使用 symfony 4.4 和 postgres 11.7。
我有一个带有 json 字段“角色”的用户类(例如 [“ROLE_USER”]、[“ROLE_USER”、“ROLE_ADMIN”]),我正在尝试检索角色字段与“ROLE_ADMIN”不匹配的用户" 使用 QueryBuilder。
我试过了
$qb = $this->createQueryBuilder('u');
return $qb
->where($qb->expr()->notLike('u.roles', ":roles"))
->setParameter('roles', $qb->expr()->literal('%ROLE_ADMIN%'))
->getQuery()
->getResult();
但错误是
SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: json !~~ unknown
LINE 1: ...e_id AS sede_id_7 FROM utente u0_ WHERE u0_.roles NOT LIKE $...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
所以下一步是使用 CAST (postgres) 函数
$query = $entityManager->createQuery("
SELECT u
FROM App\Entity\User u
WHERE CAST(u.roles AS TEXT) NOT like '%ROLE_ADMIN%'
");
错误是
[Syntax Error] line 0, col 64: Error: Expected known function, got 'CAST'
唯一成功的尝试是用标准 SQL 编写查询
$conn = $this->getEntityManager()->getConnection();
$sql = "
SELECT *
FROM utente u
WHERE CAST(u.roles AS TEXT) NOT like '%ROLE_ADMIN%'
";
$stmt = $conn->prepare($sql);
$stmt->execute([]);
return $stmt->fetchAll();
但我需要一个对象的数组,而不是二维数组。
一些帮助?
解决方案
在文档中,我发现了这种写作方式:
// Example - $qb->expr()->neq('u.id', '?1') => u.id <> ?1
public function neq($x, $y); // Returns Expr\Comparison instance
也许它会帮助你
推荐阅读
- javascript - 有什么方法可以调用下一个变量是之前调用的吗?
- reactjs - 与 NextJS 一起使用时,Material-UI 不会为组件设置样式
- r - R diff - 什么相当于面板数据Stata中的Dx来生成差异变量
- java - 使用 Appium Java 扫描 Whatsapp Web QR 码
- c - 如何使用来自特定线程的信号量来播放/暂停许多其他线程?
- flutter - GETX:如何从 GetStorage.read 创建 RxList(错误:'List
' 不是 'RxList 类型的子类型 ?在类型转换中) - c# - TabControl 的大小和位置
- swift - 如何在 SwiftUI 中为导航标题使用 SF Pro Rounded 或自定义字体?
- javascript - Cheerio 中的选择器
- excel - 如何使用 pandas 读取具有自定义格式的 excel 列?