Doctrine inner join 三张表

Doctrine inner join three tables

我正在尝试通过 Symfony 4 中的标签获取 Posts 和 Doctrine。我有三个这样的 table:

Post

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

标签

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

TagPost(标签和帖子之间的关联)

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

帖子可以有多个标签,一个标签可以用于多个帖子,这就是为什么我使用关联table。

我已经成功获取了它,但仅限于原始 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;

假设您在 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();

注意几点:

  • Repository 和 EntityManager 中的 createQueryBuilder 方法并不完全相同。 EntityManager 需要一个 ->from() 方法,而 Repository 则猜测 'from' table 并且只采用别名的构造函数参数。
  • 字段名称,如'id'、'author_id'、'datetime'等不应是数据库中字段的名称,而是原则实体的属性名称.它们可能相同,但它们可能是驼峰式而不是 snake_case(例如,'authorId'),或者它们可能完全不同。检查您的实体以确保。
  • 同样,我假设 $post 实体有一个 $tag 字段,通过 doctrine 正确定义为 ManyToMany 关系。如果是这样的话,Doctrine 将 自己 知道如何通过它的名字连接 属性 ,这样 ->innerJoin 方法将只需要一个额外的参数:别名。如果您可以包括您的实体定义,那将有助于解决任何其他问题。
  • post.tile(在 SELECT 子句的末尾)是故意的还是 post.title 的拼写错误?