Как правильно организовать сложные запросы в doctrine ?

У меня есть вот такой запрос, для получения похожих записей по тегу
SELECT Post.title, Post_Tags.article_id, count(*) count_alike_tags
                    FROM `article_tags` Post_Tags
                        LEFT JOIN `Article` Post
                        ON Post_Tags.article_id = Post.id
                        WHERE tag_id IN (SELECT tag_id FROM article_tags Post_Tags_Alias
                     WHERE Post_Tags_Alias.article_id = :id AND Post_Tags.article_id <>
                        Post_Tags_Alias.article_id)
                        GROUP BY Post_Tags.article_id
                        ORDER BY count_alike_tags DESC;


Я покопал доки и конвентировал его в доктрину примерно вот так:

$em = $this->getDoctrine()->getEntityManager();
        $connection = $em->getConnection();
        $statement = $connection->prepare("
                SELECT Post.title, Post_Tags.article_id, count(*) count_alike_tags
                    FROM `article_tags` Post_Tags
                        LEFT JOIN `Article` Post
                        ON Post_Tags.article_id = Post.id
                        WHERE tag_id IN (SELECT tag_id FROM article_tags Post_Tags_Alias
                     WHERE Post_Tags_Alias.article_id = :id AND Post_Tags.article_id <>
                        Post_Tags_Alias.article_id)
                        GROUP BY Post_Tags.article_id
                        ORDER BY count_alike_tags DESC;
        ");
        $statement->bindValue('id', 1);
        $statement->execute();
        $results = $statement->fetchAll();


Тут сразу 2 вопроса. Как все же правильно его организовать, ну скажем возможно есть более изящный вариант ?

Как я понял писать такие штуки да и вообще доктрину в контроллере не хорошо, поэтому нужно создать новый класс в Entity, например PostManager и записывать все туда. Я правильно понял ?
  • Вопрос задан
  • 2410 просмотров
Решения вопроса 1
@mind3
Используйте queryBuilder в Связке с теми Entity которые вы получили.

Большую логику выносите в сервисы. Для сложных всяких запросов создайте Custom Repositories и обращайтесь к ним в контроллере через более простые вызовы. Для нативных запросов лучше тогда вообще Doctrine не использовать, а использовать php pdo.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы