bars80081
Новичок
Добрый день,
пытаюсь пробиться сквозь тонны документации и несколько подзавяз в этом болоте. решил здесь спросить, авось кто выложит ссылочки на конкретные решения вопроса.
по мотивам Создание блога на Symfony 2.8 lts пытаюсь понять практическую пользу symfony.
Суть проблемы:
в статье описывается создание на Симфони блога. Присутствуют 2 сущности: блоги и комментарии. Несколько комментариев к одному блогу. К ним прилагаются репозитории. Соответственно, сущность комментария в коде описана примерно так:
то есть прямая связка с блогами посредством ORM. Также есть сущность Blog и репозиторий Blogger\BlogBundle\Entity\Repository\BlogRepository
В шаблоне twig при этом по выводу последних комментариев разных блогов прописано:
благодаря чему помимо содержимого комментария на каждую запись вставляется и title блога.
Всё хорошо. Но...
если посмотреть на проходящие запросы к БД, то можно увидеть отвратную картину:
на каждый требуемый блог при первом запросе формируется запрос к БД. очень хорошо, что не на каждый запрос, а только при первом. далее, он их запоминает в репозитории и отдаёт уже без запросов к БД.
конечно же, я хочу от этого избавиться.
к примеру, если я напишу в контроллере страницы до вызова данного шаблона:
то вместо этих штучных запросов мы получим всего один
как видно, он прекрасно обращается из шаблона к репозиторию.
в чём проблема?
проблема в том, что контроллер не должен отвечать за выборку данных. это дело репозитория или самой сущности. контроллеров может быть много, а репозиториев и сущностей по одному классу. я могу написать, чтобы репозиторий занимался накоплением искомых записей и при требовании осуществлял запрос сразу всех, но я не могу никак заставить шаблон twigа пройти через репозиторий или форсировать запуск поиска в репозитории из сущности.
запрос от ORM в репозиторий не проходит через метод ->find() или подобные. вызовов из сущности явным способом тоже нет. мало того, из сущности я не могу дотянуть ни до доктрины, ни до EntityManager (хотя в принципе понимаю, что и не должно вообще-то быть такого). в методе Comment::getBlog() блога может ещё не существовать, но при первом обращении внутри к $this->blog->smth; он уже оперирует объектом с заполненными данными, то есть осуществил запрос.
копаюсь в классах Симфони и документации уже несколько дней, глаза вытекают.
можете помочь обнаружить эту тонкую связь, чтобы заставить при запросе из шаблона перед проверкой в репозитории накопленных сущностей запустить подгрузку недостающих сущностей.
спасибо!
пытаюсь пробиться сквозь тонны документации и несколько подзавяз в этом болоте. решил здесь спросить, авось кто выложит ссылочки на конкретные решения вопроса.
по мотивам Создание блога на Symfony 2.8 lts пытаюсь понять практическую пользу symfony.
Суть проблемы:
в статье описывается создание на Симфони блога. Присутствуют 2 сущности: блоги и комментарии. Несколько комментариев к одному блогу. К ним прилагаются репозитории. Соответственно, сущность комментария в коде описана примерно так:
PHP:
namespace Blogger\BlogBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
/**
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\Repository\CommentRepository")
* @ORM\Table(name="comment")
* @ORM\HasLifecycleCallbacks
*/
class Comment
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="integer")
*/
protected $blog_id;
/**
* @ORM\ManyToOne(targetEntity="Blog", inversedBy="comments")
* @ORM\JoinColumn(name="blog_id", referencedColumnName="id")
*/
protected $blog;
/**
* @ORM\Column(type="text")
*/
protected $comment;
В шаблоне twig при этом по выводу последних комментариев разных блогов прописано:
HTML:
{% for comment in latestComments %}
<article class="comment">
<p class="small">{{ comment.user }} commented on {{ comment.blog.title }}</p>
<p>{{ comment.comment }}</p>
</article>
{% endfor %}
Всё хорошо. Но...
если посмотреть на проходящие запросы к БД, то можно увидеть отвратную картину:
SQL:
...
SELECT * FROM blog t0 WHERE t0.id = 15
SELECT * FROM blog t0 WHERE t0.id = 13
SELECT * FROM blog t0 WHERE t0.id = 12
конечно же, я хочу от этого избавиться.
к примеру, если я напишу в контроллере страницы до вызова данного шаблона:
PHP:
$idis = array();
foreach($latestComments as $comment) {
$idis[] = $comment->getBlogId();
}
$em->getRepository('BloggerBlogBundle:Blog')->findBy(array('id' => $idis));
SQL:
SELECT * FROM blog t0 WHERE t0.id IN (15,13,12)
в чём проблема?
проблема в том, что контроллер не должен отвечать за выборку данных. это дело репозитория или самой сущности. контроллеров может быть много, а репозиториев и сущностей по одному классу. я могу написать, чтобы репозиторий занимался накоплением искомых записей и при требовании осуществлял запрос сразу всех, но я не могу никак заставить шаблон twigа пройти через репозиторий или форсировать запуск поиска в репозитории из сущности.
запрос от ORM в репозиторий не проходит через метод ->find() или подобные. вызовов из сущности явным способом тоже нет. мало того, из сущности я не могу дотянуть ни до доктрины, ни до EntityManager (хотя в принципе понимаю, что и не должно вообще-то быть такого). в методе Comment::getBlog() блога может ещё не существовать, но при первом обращении внутри к $this->blog->smth; он уже оперирует объектом с заполненными данными, то есть осуществил запрос.
копаюсь в классах Симфони и документации уже несколько дней, глаза вытекают.
можете помочь обнаружить эту тонкую связь, чтобы заставить при запросе из шаблона перед проверкой в репозитории накопленных сущностей запустить подгрузку недостающих сущностей.
спасибо!