主义内部联接三个表

时间:2018-09-24 15:26:51

标签: doctrine inner-join symfony4

我正在尝试使用Doctrine在Symfony 4中获取“标签发帖”。我有三个这样的表:

发布

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

标签

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

TagPost(在标签和帖子之间建立关联)

--------------------
| 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 个答案:

答案 0 :(得分:0)

假设您是在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方法在存储库和EntityManager中并不完全相同。 EntityManager需要一个->from()方法,而Repository则猜测'from'表,而只取别名的构造函数参数。
  • 字段名称(例如“ id”,“ author_id”,“ datetime”等)不应是数据库中字段的名称,而应是教义实体的属性的名称。它们可能是相同的,但它们可能是camelCase而不是snake_case(例如'authorId'),或者它们可能完全不同。检查您的实体以确保。
  • 类似地,我假设$ post实体具有一个$ tag字段,该字段通过学说正确地定义为ManyToMany关系。在这种情况下,Doctrine将通过其名称自行知道 如何将该属性加入,因此->innerJoin方法将仅需要一个附加参数:别名。如果您可以包括实体定义,则将有助于解决任何其他问题。
  • post.tile(在SELECT子句的末尾)是故意的还是post.title的拼写错误?