【问题标题】:Doctrine 2 query missing part of inner joinDoctrine 2 查询缺少内部连接的一部分
【发布时间】:2011-03-14 18:44:52
【问题描述】:

我正在使用 Doctrine 2 尝试使用内部连接进行查询。我有一个站点实体和一个页面实体。每个站点可以有多个页面,每个页面只能属于一个站点。我的 pages 表行中有一个 site_id 外键。在我的 Site 实体中,我创建了一个 OneToMany 关联,其中目标实体是我的 Page 实体,并且 mappedBy 设置为 Site。

/**
 * @var \Doctrine\Common\Collections\ArrayCollection
 * @OneToMany(targetEntity="Page", mappedBy="Site", cascade={"persist", "remove"})
 */
private $pages;

在我的 Page 实体中,我有一个 ManyToOne 关联,其中目标实体设置为 Site。

/**
 * @var App\Entity\Site
 * @ManyToOne(targetEntity="Site")
 */
private $site;

这是我的查询构建器语句,我在其中传递了一个特定的站点 ID:

$qb = $this->_em->createQueryBuilder();
$qb->select('s')
    ->from('App\Entity\Site', 's')
    ->innerJoin('s.pages', 'p')
    ->where('s.id = :id')
    ->setParameter('id', $id);

这是我返回的实际 SQL:

SELECT s0_.id AS id0, s0_.domain AS domain1 FROM sites s0_ INNER JOIN  WHERE s0_.id = ?

看看 INNER JOIN 信息是如何完全丢失的?我在这里做错了什么还是 Doctrine 2 有问题?

【问题讨论】:

    标签: doctrine-orm


    【解决方案1】:

    您需要明确告诉 Doctrine 获取这些列:

    $qb->select('s', 'p')
       ->form(...)
       ->join(...) 
    

    【讨论】:

    • 我选择什么并不重要,只要我在其中包含“s”。在我的真实查询中,我包含了“p”,但我只是从查询中删除了所有无关的内容以简化我的问题。
    【解决方案2】:

    想通了。我的 mappedBy 语句在 Site 实体中不正确。我指向的是“站点”,而它应该是“站点”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      相关资源
      最近更新 更多