php - 选择实体假设相关实体不存在

标签 php mysql orm doctrine-orm doctrine

我的实体(产品)与另一个名为 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/

相关文章:

php - 在 $model->find Yii 中使用 UTC_TIMESTAMP()

php - SQL查询,什么是 `SELECT * FROM !.tables WHERE id = !`

javascript - 如何将 PHP 值传递给 Javascript 并重定向到其他页面?

MySQL 脚本 1064 错误

c# - 在 Fluent NHibernate 中将 URI 映射到字符串

java - Hibernate Criteria 唯一结果(键以外的列)

php - 如何在 mycontroller 中获取 laravel 5.2 ADLDAP 提供程序实例?

php imagecopyresampled 问题

php - .htaccess 指向页面的 php 版本(如果存在)

Java ORM 建议