代码之家  ›  专栏  ›  技术社区  ›  Jules R

连接三个表

  •  0
  • Jules R  · 技术社区  · 6 年前

    岗位

    ------------------------------
    | id | title | content | ... |
    ------------------------------
    

    -------------
    | id | name |
    -------------
    

    TagPost(使标记和post之间产生关联)

    --------------------
    | tag_id | post_id |
    --------------------
    

    我已经成功地得到了它,但只是用原始sql,我用查询生成器尝试了多次,但没有办法得到它。有什么建议吗?

    查询(工作):

    "SELECT post.id, post.title, post.author_id, post.content, post.datetime, 
    post.tile FROM post
    INNER JOIN tag_post ON post.id = tag_post.post_id
    INNER JOIN tag ON tag_post.tag_id = tag.id
    WHERE tag.id = " . $tag_id;
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   NicolasB    6 年前

    假设您是在PostRepository中的方法中编写的( https://symfony.com/doc/3.3/doctrine/repository.html ),你会写:

    $qb = $this->createQueryBuilder('post')
      ->select('post.id, post.title, post.author_id, post.content, post.datetime, post.tile')
      ->innerJoin('post.tag', 't')
      ->where('t.id = :tagid')
      ->setParameter('tagid', $tag_id)
    ;
    
    $result = $qb->getQuery()->getResult();
    

    需要注意的几点:

    • 这个 createQueryBuilder ->from() 方法,而存储库可以猜测“from”表,而只接受别名的构造函数参数。
    • 字段名,如'id'、'author\u id'、'datetime'等,不应该是数据库中字段的名称,而应该是实体属性的名称。它们可能是相同的,但它们可能是camelCase而不是snake\u case(例如,“authord”),或者它们可能完全不同。检查您的实体以确保。
    • 类似地,我假设$post实体有一个$tag字段,该字段是通过一个manytomy关系的条令正确定义的。如果是这样,条令就会知道 独自一人 如何通过名称连接该属性,以便 ->innerJoin 方法只需要一个附加参数:别名。如果您可以包含实体定义,这将有助于解决任何其他问题。
    • post.tile (在SELECT子句末尾)是故意的还是拼写错误 post.title