学说。一个where子句中包含多个json_contains请求。

问题描述 投票:0回答:1

我试图解决以下问题。

我想通过用户的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)

找不到正确的方法。:)

php mysql symfony doctrine
1个回答
0
投票

沿着这条线的东西应该可以做到这一点。

$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之前设置参数。


0
投票

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 . '"');

}

这对我来说非常有效。谢谢你!

© www.soinside.com 2019 - 2024. All rights reserved.