我正在尝试使用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;
答案 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'表,而只取别名的构造函数参数。->innerJoin
方法将仅需要一个附加参数:别名。如果您可以包括实体定义,则将有助于解决任何其他问题。post.tile
(在SELECT子句的末尾)是故意的还是post.title
的拼写错误?