Doctrine实体管理器通过空数组集合查找

Tur*_*ise 4 php doctrine query-builder symfony doctrine-orm

我有一个名为 Cycle 的实体,与 CycleActeur 具有 OneToMany 关联(请参见下面的代码)。

\n\n

我希望能够使用控制器中的简单原则 findBy* 方法来获取数据库中没有关联的 CycleActeur 对象的所有 Cycle 对象。

\n\n

也就是说:

\n\n
$manager = $this->getContainer()->get(\'doctrine.orm.entity_manager\');\n$cycleManager =  $manager->getRepository(\'ESI67Zen2Bundle:Cycle\');\n$cyclesWithNoCycleActeur = $cycleManager->findBy(\'acteurs\', null);\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有一种方法可以做到这一点,而无需在 CycleRepository 中编写特定方法?

\n\n

从 Cycle 类代码中摘录

\n\n
class Cycle {\n  /**\n   * @ORM\\OneToMany(\n   *      targetEntity="CycleActeur", \n   *      mappedBy="cycle", \n   *      orphanRemoval=true)\n   */\n  private $acteurs;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

从 Cycle 类代码中摘录

\n\n
class CycleActeur {\n /**\n  * @var Cycle Le cycle concern\xc3\xa9\n  * \n  * @ORM\\ManyToOne(targetEntity="Cycle", inversedBy="acteurs")\n  * @ORM\\JoinColumn(name="cycle_id", referencedColumnName="id")\n  * \n  */\n  private $cycle;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

在这种情况下(在我看来)最好的方法是使用 DQL 的条件IS EMPTY

  $manager
    ->createQueryBuilder()
    ->from(Cycle::class, 'cycle')
    ->select('cycle')
    ->andWhere('cycle.acteurs IS EMPTY')
    ->getQuery()
    ->getResult()
    ;
Run Code Online (Sandbox Code Playgroud)

您可以在 EntityRepository 或您有权访问 EntityManager 的任何地方使用此代码。

来源:学说文档