如何在具有多对多关系的实体存储库中创建查询?空查询

时间:2016-01-19 21:50:45

标签: symfony dql

我在广告和文档之间有多对多的关系:这是3个表:

广告
文件
document_advert。

如何从广告中获取author,从文档中获取path? 第一次尝试不会抛出任何错误,但查询似乎是空的,我不会从调试器中理解这一点:

[![在此处输入图像说明] [1]] [1]

[![在此处输入图像说明] [2]] [2]

我的目标在sql中是这样的:

SELECT d.path, a.author 
FROM document_advert da 
JOIN document d 
JOIN advert a 
WHERE da.advert_id = 1 
AND da.document_id = d.id

我的尝试(我在AdvertRepository中):

public function getDocNames($id){
     $em = $this->getEntityManager();

    $query = $this->createQueryBuilder('a')
            ->join('a.document', 'd')
            ->addSelect('d')
            ->where("a.id = :id")
            ->setParameter('id', $id)
            ->getQuery()
    ;
    return $query->getResult();
    //issue: empty query

}

编辑:我正在尝试从d获取所有值,而不是明确地调用它们(我不想做d.path, d.name, etc.而是d)。但是" .path"如果我没有添加" d.path"则在树枝文件中无法识别在查询中。

在树枝上:

{% for doc in docNames %}
    {{ doc.path }}
{% endfor %}

如果我在查询中删除.path," .path" "不存在" :这是DQL格式的查询:

public function getDocNamesC($id){
        $query = $this->_em->createQuery("SELECT a, d.path FROM OCPlatformBundle:Advert a JOIN a.documents d WHERE a.id = $id");
        return $query->getResult();
    }

1 个答案:

答案 0 :(得分:2)

不确定为什么定义了$em变量并且没有使用它。我假设你正在尝试做类似下面的事情。

public function getDocNames($id){
    $qb = $this->getEntityManager()->createQueryBuilder();

    return $qb->select('a.author')
        ->addSelect('d.path')
        ->from('OCPlatformBundle:Advert', 'a')
        ->join('a.documents', 'd')
        ->where(
            $qb->expr()->eq('a.id', ':id')
        )
        ->setParameter('id', $id)
        ->getQuery()
        ->getResult();
}

如果你想获得完整的实体

public function getDocNames($id){
    $qb = $this->getEntityManager()->createQueryBuilder();

    return $qb->select('a')
        ->addSelect('d')
        ->from('OCPlatformBundle:Advert', 'a')
        ->join('a.documents', 'd')
        ->where(
            $qb->expr()->eq('a.id', ':id')
        )
        ->setParameter('id', $id)
        ->getQuery()
        ->getResult();
}

然后在Twig中访问结果时

{% for advert in docNames %}
    {{ advert.name }}

    {% for document in advert.documents %}
       {{ document.path }}
    {% endfor %}
{% endfor %}

我们需要遍历文档,因为它是many-to-many关系,因此每path没有advert个。