Вложенная `for loop` печать всех объектов, а не связанных объектов - PullRequest
0 голосов
/ 14 мая 2019

В настоящее время я работаю над форумом, используя Symfony 4 и Doctrine.

У меня проблемы с пониманием того, что делать дальше, и мне нужен вклад, чтобы узнать, как мне двигаться дальше, чтобы получить желаемые результаты.

мои знания ограничены, и я проходил курс KNPU для Symfony 4> Doctrine, по общему признанию, я просмотрел несколько разделов учебников по Отношениям, но сценарий «извлечения отношений» отличается от моего собственного, только учебниквыбирает 1 объект, определенный {slug}, это поможет мне позже.

Мое намерение

Я пытаюсь вытянуть всю мою сущность категории и зациклить имена как заголовки html, затем внутриэтот цикл хочет запустить другой цикл, чтобы перечислить темы, связанные с этой категорией.Для справки core.html.twig Шаблон, содержащий мои циклы (включен в базовый шаблон, чтобы его можно было перезаписать)

<div>
    <div id="forum head">
        <div id="category">
        {% for category in categories %}
            <h4>{{ category.name }}</h4>
            {% for topic in topics %}
                <h6>{{ topic.name }}</h6>
            {% endfor %}
        {% endfor %}
        </div>
    </div>
</div>

Моя проблема

Как построить массив тем в контроллерея всегда получаю ВСЕ темы независимо от ассоциации.

Гипотеза, потому что я призываю ВСЕ объекты категории, тогда я ссылаюсь на категорию, чтобы уточнить темы, передавая ВСЕ идентификаторы категории и, следовательно, возвращая все темы.

ВесьКонтроллера здесь нет, но я включил фрагмент функции

     /**
     * @Route("/forum", name="page_forum")
     */
    public function index(CategoryRepository $repository, TopicRepository $topicRepository)
    {
        $category = $repository->findBy([],['placement' => 'ASC']);
        $topic = $topicRepository->findBy(['category' => $category],['placement' => 'ASC']);

        return $this->render('forum/index.html.twig', [
            'categories' => $category,
            'topics' => $topic
        ]);
    }

В своем профилировщике я вижу SQL, выполненный для получения моих тем

SELECT t0.id AS id_1, 
t0.name AS name_2, 
t0.placement AS placement_3,
t0.created_at AS created_at_4, 
t0.updated_at AS updated_at_5,
t0.category_id AS category_id_6 
FROM topic t0 
WHERE t0.category_id IN (?) ORDER BY t0.placement ASC
Parameters:
[▼
  [▼
    41
    42
    43
    44
    45
  ]
]

Это доказывает, что тема использует ВСЕ категорииИдентификаторы.

Вплоть до медных уловок, как мне сделать, чтобы мой цикл "топики" выдвигал только правильные темы для категории, в которую он вложен?Пользовательский запрос (если так, как моя попытка не удалась), фильтр расширения ветки?или любой метод, о котором я не думал?

Буду признателен за любые советы по преодолению этого препятствия. Если я что-то пропустил, дайте мне знать

РЕДАКТИРОВАТЬ:

Мои сущности Category & Topic связаны следующим образом (увидел похожий вопрос, включая эти, и понял, что он довольно бессилен)

Категория

     /**
     * @ORM\OneToMany(targetEntity="App\Entity\Topic", mappedBy="category")
     */
    private $topics;

Тема

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Category", inversedBy="topics")
     * @ORM\JoinColumn(nullable=false)
     */
    private $category;

1 Ответ

0 голосов
/ 14 мая 2019

Предполагая, что вы уже добавили свои геттеры и сеттеры к своим сущностям, вы сможете использовать их в своем шаблоне веточки:

<div id="forum head">
    <div id="category">
    {% for category in categories %}
        <h4>{{ category.name }}</h4>
        {% for topic in category.getTopics() %}
            <h6>{{ topic.name }}</h6>
        {% endfor %}
    {% endfor %}
    </div>
</div>

также вам не нужно возвращать объекты Topic в вашем контроллере:

 /**
 * @Route("/forum", name="page_forum")
 */
public function index(CategoryRepository $repository, TopicRepository $topicRepository)
{
    $category = $repository->findBy([],['placement' => 'ASC']);
    //$topic = $topicRepository->findBy(['category' => $category],['placement' => 'ASC']);

    return $this->render('forum/index.html.twig', [
        'categories' => $category,
        //'topics' => $topic
    ]);
}

это может помочь вам еще больше

...