【问题标题】:Symfony2 Mapping 4 table Inner Join query to Doctrine QueryBuilderSymfony2 Mapping 4 table Inner Join 查询到 Doctrine QueryBuilder
【发布时间】:2015-09-26 12:00:13
【问题描述】:

我有 4 个表,实体中的属性都进行了相应的映射。我正在尝试根据选定的标签查询文章。

articles => id, title, author_id - NAMESPACE AppBundle/Enity/Article
tags => id, name - NAMESPACE AppBundle/Entity/Tag
article_tags => article_id, tag_id
authors=> id, name - NAMESPACE AppBundle/Entity/Author

我已经弄清楚如何在 article_tags 表中获取所有标签具有与其相关的 id 的文章,并按作者 id 进行过滤。在 SQL 中,我的查询看起来像这样。经过测试并且可以正常工作。

SELECT 
    articles.title, articles.id, authors.name
FROM
    article_tags
INNER JOIN tags
    ON article_tags.tag_id = tags.id
INNER JOIN articles 
    ON article_tags.article_id = article.id
INNER JOIN authors
    ON authors.id = articles.author_id
WHERE
    tags.id IN (1,2)

我正在尝试构建一个代表上述 sql 的查询。到目前为止,我的理解是,学说会根据实体中的 ORM 断言自动选择所需的关联。但是我不确定如何将其他实体带入查询。这是我目前所拥有的。

我在文章 repo 中的代码是:

   $qb = $this->createQueryBuilder('ar')
            ->select('ar.title, ar.id, au.name')
            ->from('article_tags', 'at')
            ->innerJoin('tags', 't', 'WITH', 'at.tag_id = t.id')
            ->innerJoin('ar', 'WITH', 'at.article_id = ar.id')
            ->innerJoin('authors', 'au', 'WITH', 'au.id = ar.author_id')
            ->where('at.id IN (1,2)');

    return $qb->getQuery()->getResult();

我已经用“ON”和“WITH”关键字尝试了上面的代码。

我的错误是: [语义错误] line 0, col 76 near 'tags t WITH at.tag_id': Error: Class 'tags' is not defined.

【问题讨论】:

    标签: php mysql symfony doctrine


    【解决方案1】:

    当您使用 Doctrine ORM 进行连接时,您不需要指定连接条件,因为它应该在实体的元数据中。

    因此,在您的实例中,您有与标签和作者相关的文章,如果您想要标签和作者连同您的文章,您的查询应该类似于:

    // this is in the article repository I'm guessing?
    $qb = $this->createQueryBuilder('ar');
    $qb->addSelect([ 't', 'au' ])
        ->join('ar.tags', 't')
        ->join('ar.authors', 'au')
        ->where($qb->expr()->in('a.tags', ':tags'))
        ->setParameter('tags', [ 1, 2 ]);
    

    所以这两个连接语句是关于实体的属性,在本例中为 tagsauthors。在您的文章实体中,您需要根据the documentation 将它们设置为关联。元数据定义了文章与标签和作者的关系,而 Doctrine(通常)会填补这些空白。您的查询看起来仍在考虑 SQL,而不是实体和 Doctrine(和 DQL)。

    附带说明一下,上面的查询并不是一个很好的查询,因为返回的行数将等于标签和作者的数量,最好不要在没有额外实体的情况下进行查询选择,然后抓取标签(例如通过$article->getTags())。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      相关资源
      最近更新 更多