В форме Symfony 4 мне нужно использовать что-то вроде опции query_builder
, которая доступна на EntityType
, но на CollectionType
.Здесь есть похожий вопрос здесь без хороших ответов.
В моем проекте каждая Site
сущность имеет множество Goal
.Каждый Goal
имеет числовую цель и конкретную дату.Я хочу редактировать цели сайта только на конкретную дату.Проблема заключается в том, что форма CollectionType извлекает все целей для отображения в форме, но я хочу получить только цели на определенную дату.Как?На CollectionType
нет query_builder
, как на EntityType
.Я мог бы изменить геттер в моем объекте Site, но я не знаю, как передать нужную дату моему геттеру.
На данный момент мой обходной путь - это рендеринг всей формы (со ВСЕМИ связанными целями длязаданный сайт), а затем используйте JavaScript, чтобы скрыть все цели, кроме тех, которые имеют дату для редактирования.Это работает, но это ужасное решение для сайтов с множеством целей, охватывающих несколько дат.
Моя Site
сущность (отображается только соответствующий код):
class Site
{
public function __construct()
{
$this->goals = new ArrayCollection();
}
/** @ORM\OneToMany(targetEntity="App\Entity\Goal", mappedBy="site") */
private $goals;
public function getGoals()
{
return $this->goals;
}
}
и моясвязанные Goal
сущности:
class Goal
{
/** @ORM\Column(type="date") */
private $goalDate;
/** @ORM\Column(type="integer") */
private $goal;
/** @ORM\ManyToOne(targetEntity="App\Entity\Site", inversedBy="goals") */
private $site;
// ...
}
Мои формы:
class SiteGoalsAdminForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('goals', CollectionType::class, [
'entry_type' => GoalsEmbeddedForm::class,
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Site::class
]);
}
}
и форма индивидуальной цели:
class GoalsEmbeddedForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('goal', IntegerType::class)
->add('goalDate', DateType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Goal::class,
]);
}
}