【发布时间】:2021-05-13 15:51:09
【问题描述】:
我有两张表 1) 价格和 2) 用户
Owner 是价格表中的一列。
两个表在 price.users 和 users.price 之间具有多对多关系。
下面的查询返回 owner1 和 user1 共享的所有价格。
问题:如何解决这个查询,它只返回所有没有与 user1 同步的 owner1 价格。
如果我使用 ->andWhere('u.id = :user1Id') 那么我只会得到 user1 的记录。
如果我使用 ->andWhere('u.id != :user1Id') 那么我会获得所有所有者记录,包括 user1 记录。
再次,我想要所有所有者记录,但与 user1 同步的记录除外。 到目前为止,我已经尝试了以下方法:
1) $queryUsersPrices
->innerJoin('p.owner', 'o')
->leftJoin('p.users', 'u')
->andWhere('o.id = :ownerId')
/*I need to Remove records for u.id from results*/
->andWhere('u.id = :user1Id')
->setParameter('owner1Id', $owner->getId())
->setParameter('user1Id', $user->getId());
$userPrices = $queryUsersPrices->getQuery()->getResult();
2) $userPrices = $repository->createQueryBuilder($alias);
$userPrices
->select("u.prices")
->from("Price","p")
->innerJoin('p.users', 'u')
->andWhere('u.id = :userId')
->getDQL();
$query = $repository->createQueryBuilder($alias);
$query
->innerJoin($alias . '.owner', 'o')
->innerJoin($alias . '.priceType', 'pt')
->innerJoin($alias . '.model', 'm')
->where(
$query->expr()->not(
$query->expr()->in(
'p.id',
$userPrices
)
)
)
->andWhere('m.status = :m_status')
->andWhere('o.id = :adminId')
->andWhere('pt.site <> 1')
->setParameter('m_status', Model::STATUS_ACTIVE);
$result = $query->getQuery()->getResult();
3) $query = $repository->createQueryBuilder($alias);
$query
->innerJoin($alias . '.owner', 'o')
->innerJoin($alias . '.users', 'u', 'WITH', 'u.id =
:userId')
->innerJoin($alias . '.priceType', 'pt')
->innerJoin($alias . '.model', 'm')
->where('m.status = :m_status')
->andWhere('o.id = :adminId')
->andWhere('u.id IS NULL')
->andWhere('pt.site <> 1')
->setParameter('adminId', $adminUser->getId())
->setParameter('userId', $user->getId())
->setParameter('m_status', Model::STATUS_ACTIVE);
$test = $query->getQuery()->getResult();
方法 #1 只产生用户 1 的价格
方法 #2 导致此错误:错误:方法 Doctrine\Common\Collections\ArrayCollection::__toString() 不得抛出异常,已捕获 Symfony\Component\Debug\Exception\ContextErrorException: Catchable Fatal Error: Object of class Doctrine\ORM\EntityManager 无法转换为字符串
方法 #3 仅产生所有者价格
这实际上是基于 M Khalid Junaid 的回答
$userPrices = $repository->createQueryBuilder('pr')
->innerJoin('pr.users', 'u')
->andWhere('u.id = :userId')
->setParameter('userId', $user->getId())
->getDQL();
$query = $repository->createQueryBuilder($alias);
$query
->innerJoin($alias . '.owner', 'o')
->innerJoin($alias . '.priceType', 'pt')
->innerJoin($alias . '.model', 'm')
->where(
$query->expr()->not(
$query->expr()->in(
$alias . '.id',
$userPrices
)
)
)
->andWhere('m.status = :m_status')
->andWhere('o.id = :adminId')
->andWhere('pt.site <> 1')
->setParameter('m_status', Model::STATUS_ACTIVE)
->setParameter('adminId', $adminUser->getId())
->setParameter('userId', $user->getId());
$result = $query->getQuery()->getResult();
【问题讨论】:
-
方法 #3 仅产生所有者价格如果这不是您的预期输出,请在结果集中指定您还需要什么
标签: doctrine-orm doctrine doctrine-query