Учение о внутреннем соединении трех столов - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь получить сообщения по тегам в Symfony 4 с Doctrine.У меня есть три таблицы, подобные этой:

Post

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

Tag

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

TagPost (который устанавливает связь между тегами и сообщениями)

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

Может быть несколько тегов по сообщениям, и тег может использоваться для нескольких сообщений, поэтому я использую таблицу ассоциации.

Мне уже удалось получить ее, но только с использованием raw 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 голосов
/ 24 сентября 2018

Предполагая, что вы пишете это внутри метода в вашем 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 не совсем одинаков в Repository и EntityManager. EntityManager нужен метод ->from(), в то время как Repository угадывает таблицу from и вместо этого принимает просто аргумент конструктора для псевдонима.
  • Имена полей, такие как 'id', 'author_id', 'datetime' и т. Д., Должны быть не именами полей в вашей базе данных, а именами свойств ваших сущностей доктрины. Они могут совпадать, но они, вероятно, camelCase вместо snake_case (например, 'authorId'), или они могут быть совершенно другими. Проверьте ваши сущности, чтобы убедиться.
  • Аналогично, я предполагаю, что сущности $ post имеютполе $ tag, правильно определенное через doctrine как отношение ManyToMany. Если это так, Doctrine самостоятельно будет знать *1016*, как присоединить это свойство по его имени, чтобы->innerJoin метод будет нуждаться только в одном дополнительном параметре: псевдоним.Если бы вы могли включить определения ваших сущностей, это помогло бы устранить любые дополнительные проблемы.
  • Является ли post.tile (в конце предложения SELECT) преднамеренным или это неправильная запись post.title?
...