我试图解决以下问题。
我想通过用户的mandant和角色来过滤通知。用户只能有1个mandant和多个角色。
DB中的角色字段包含一个json数组,其中包含应该读取通知的角色。
我有一个包含实际用户角色的数组。
$roles= array('role1','role2','role3')
现在我需要做这样的事情。
select *
from notification
where (mandant_id = 'xxxxx' or mandant_id is null)
AND (JSON_CONTAINS(roles, '\"role1\"', '$') = 1 OR JSON_CONTAINS(roles, '\"role3\"', '$') = 1)
ORDER BY created_at DESC LIMIT 10
Mandant部分很简单:
$queryBuilder->where('notification.mandantId = :mandantId OR notification.mandantId is null');
$queryBuilder->setParameter('mandantId', $userMandantId, MandantIdDoctrineType::NAME);
现在我需要在数组$roles上循环,然后把查询放在一个where子句和OR子句中。
我需要这样一个循环。
foreach($roles AS $role){
....build up the query sting....
}
结果是这样的。
$qb->andWhere(JSON_CONTAINS(roles, '\"role1\"', '$') = 1 OR JSON_CONTAINS(roles, '\"role3\"', '$') = 1)
找不到正确的方法。:)
沿着这条线的东西应该可以做到这一点。
$roles = ['role1', 'role2', 'role3'];
$roleQueryParts = [];
$i = 0;
foreach ($roles as $role) {
++$i;
// build the individual conditionals of your OR chain
$roleQueryParts[] = "JSON_CONTAINS(roles, :role$i, '$') = 1";
// set the role parameters - note we're passing them as strings wrapped in "
$queryBuilder->setParameter('role' . $i, '"' . $role . '"');
}
// fuse the conditionals into one string of condition 1 OR condition 2 OR...
$roleQuery = implode(' OR ', $roleQueryParts);
$queryBuilder->andWhere($roleQuery);
你可能需要把... setParameter()
咬合 foreach
之后 andWhere()
- 我不记得Doctrine是否会让你在添加到SQL之前设置参数。
thx @bananaapple 你让我很开心。
它工作得很好,除了我不得不加入的第二个循环和重新修改->和Where Query。
$roles = ['role1', 'role2', 'role3'];
$roleQueryParts = [];
$i = 0;
foreach ($roles as $role) {
++$i;
// build the individual conditionals of your OR chain
$roleQueryParts[] = "JSON_CONTAINS(roles, :role$i, '$') = 1";
}
// fuse the conditionals into one string of condition 1 OR condition 2 OR...
$roleQuery = implode(' OR ', $roleQueryParts);
// fire the query
$queryBuilder->andWhere($roleQuery);
$i = 0;
foreach ($roles as $role) {
++$i;
// set the role parameters - note we're passing them as strings wrapped in "
$queryBuilder->setParameter('role' . $i, '"' . $role . '"');
}
这对我来说非常有效。谢谢你!