我的实体(产品)与另一个名为 deletedByCompanies 的实体(公司)具有单向多对多关系。
我希望选择所有未被特定公司删除的产品。这是所有未通过多对多关系连接的产品。
尝试过:
$this->em->getRepository(Product::class)->createQueryBuilder('t')
->leftJoin('t.deletedByCompanies', 'deletedCompany')
->andWhere('deletedCompany.id not in (:companyId)')
->setParameter('companyId', [$companyId]);
但这根本不会返回任何东西。 架构非常简单:
Product:
id: int PK
Company:
id: int PK
DeletedProducts
product_id: int FK
company_id: int FK
Product 类中的实体定义:
/**
* @var Company[]
* @ORM\ManyToMany(targetEntity="Company", indexBy="id")
* @ORM\JoinTable(name="DeletedProducts")
*/
protected $deletedByCompanies;
最佳答案
我认为您可以在 deletedby 表上使用 NOT EXISTS
子句来解决您的问题。
在 SQL 方言中:
SELECT * FROM product p WHERE NOT EXISTS
(SELECT * FROM DeletedProducts d WHERE p.id=d.product_id AND company_id = 2 );
在 Doctrine2 DQL 中,我们没有实体 DeletedProducts
所以我们必须做更多的事情,比如:
$qb = $this->em->getRepository("AcmeDemoBundle:Product")->createQueryBuilder('t')
->Join('t.deletedByCompanies', 'deletedCompany')
->andWhere('deletedCompany.id in (:companyId)')
->andWhere("p=t");
$mainQb = $this->em->getRepository("AcmeDemoBundle:Product")->createQueryBuilder('p');
$mainQb->where($mainQb->expr()->not($mainQb->expr()->exists($qb->getDQL())));
$mainQb->setParameter('companyId', [$companyId]);
var_dump($mainQb->getQuery()->getSql());
$res =$mainQb->getQuery()->execute();
如果我不明白你的问题,请告诉我。
希望对你有帮助
关于php - 选择实体假设相关实体不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28430160/