【问题标题】:How to fetch remote table ids through an association table with Doctrine2 DQL如何使用 Doctrine2 DQL 通过关联表获取远程表 ID
【发布时间】:2012-10-30 10:49:28
【问题描述】:

我有以下模型,其中包含 2 个表 foobar 以及它们之间的 foo_has_bar 关联:

对于给定的foo.id,我正在尝试获取所有对应的bar.id

到目前为止,我已经能够从foo_has_bar 中检索与特定foo.id 相关的所有条目,如下所示:

$query = $em->createQuery("SELECT h FROM 'FooHasBar' h INNER JOIN h.foo f WHERE f.id = ?1");
$query->setParameter(1, $foo_id);
$results = $query->getArrayResult();

问题是$results 只包含foo_has_barid 字段,而不包含外键foo_idbar_id,因此我无法实现我想要的。

有没有办法,给定一个特定的foo.id,用一个 DQL 命令检索所有对应的bar.id

【问题讨论】:

    标签: php doctrine doctrine-orm foreign-keys dql


    【解决方案1】:

    假设实体FooHasBar 分别与FooBar 有一个关系foo 和一个关系bar,则查询非常简单:

    $q = $em->createQuery(
        'SELECT 
            b.id as bar_id, f.id as foo_id 
        FROM FooHasBar fb 
        JOIN fb.bar b 
        JOIN fb.foo f 
        WHERE f.id = :fooId'
    );
    $q->setParameter( 'fooId', $foo->getId() );
    
    $results = $query->getArrayResult();
    

    【讨论】:

      【解决方案2】:

      如果实体之间的关联是双向的:

      $q = $em->createQuery( 'SELECT b.id FROM Bar b JOIN b.fooHasBar x WHERE x.foo = :fooId' );
      $q->setParameter( 'fooId', $foo->getId() );
      
      $results = $query->getScalarResult();
      

      如果实体之间的关联是单向的(这只适用于 Doctrine 2.3+):

      $q = $em->createQuery( 'SELECT b.id FROM Bar b JOIN FooHasBar x WITH x.bar = b.id WHERE x.foo = :fooId' );
      $q->setParameter( 'fooId', $foo->getId() );
      
      $results = $query->getScalarResult();
      

      【讨论】:

      • 谢谢,但他们都失败了。第一个以Class Bar has no association named fooHasBar 失败,我认为它指的是JOIN b.fooHasBar,而第二个以Identification Variable FooHasBar used in join path expression but was not defined before 失败,我认为它指的是JOIN FooHasBar x。任何想法如何使这项工作?
      • @Jasper 他在那里没有ManyToMany 关联...顺便说一句,这令人困惑。
      • 我假设存在 ManyToOne/OneToMany 关联,并且实体/属性的命名方式与表/列的名称一样(驼峰式)。 @user359650:也许您可以提供(相关部分)您的实体代码?
      • 谢谢Jasper,但因为我从Ocramius 的回答中得到了我想要的东西,所以没有必要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多