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
的拼写错误?
我正在尝试通过 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
的拼写错误?