Формы коллекций Symfony — Сохранить в json_array

Как создать коллекции полей и сохранить их в одном столбце БД типа json_array?

В моем объекте есть столбец date_data, который имеет тип json_array. Я хочу отобразить два поля на фронтоне.

Первое поле -> от - тип даты.
Второе поле -> до - тип даты.

Я использую библиотеку ретранслятора jQuery для рендеринга этих полей как поля ретранслятора во внешнем интерфейсе. И хотите сохранить данные полей из повторителя в столбце date_data в БД, как это.

[{"from": '12/31/2009' , "to": '01/16/2010' }, {"from": '02/10/2011' , "to": '02/16/2011' }]

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
5 186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать сущность со столбцом json для своих данных:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Test
 *
 * @ORM\Table(name = "test")
 * @ORM\Entity(repositoryClass = "App\Repository\TestRepository")
 */
class Test
{
    /**
     * @var integer
     *
     * @ORM\Column(name = "id", type = "integer", options = {"unsigned":true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "IDENTITY")
     */
    private $id;

    /**
     * @var array|null
     *
     * @ORM\Column(name = "data", type = "json", nullable=true)
     */
    private $data;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getData(): ?array
    {
        return $this->data;
    }

    public function setData(?array $data): self
    {
        $this->data = $data;

        return $this;
    }
}

и 2 формы: первая для объекта и вторая для элемента сбора данных:

Приложение\Форма\Тест

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type as FormType;

class Test extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('data', FormType\CollectionType::class, [
                'allow_add' => true,
                'allow_delete' => true,
                'entry_type' => 'App\\Form\\Data',
                'label' => 'Data',
            ])
            ->add('save', FormType\SubmitType::class, [
                'label' => 'Save',
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'App\\Entity\\Test',
        ]);
    }
}

Приложение\Форма\Данные

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type as FormType;

class Data extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('from', FormType\TextType::class, [
                'label' => 'from',
            ])
            ->add('to', FormType\TextType::class, [
                'label' => 'to',
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
    }
}

И в контроллере

    $test = $this->getDoctrine()->getRepository('App:Test')->find(1);

    $form = $this->createForm(\App\Form\Test::class, $test, []);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        dump($form->getData());
        $this->getDoctrine()->getManager()->flush();
    }

Tnx. Я думаю, это работает. Но я не знаю, как визуализировать форму в .twix. Я использую {{ form_start(form) }} {{ form_row(form) }} <ul> {% for fields in form.data %} <li> {{ form_errors(fields) }} {{ form_widget(fields) }} </li> {% endfor %} </ul> {{ form_end(form) }} и не вижу полей в браузере.

NGrdanjski 14.05.2019 10:24

вы можете визуализировать всю форму {{ form(form) }}

Max P. 14.05.2019 10:28

Я знаю, но в dom я вижу тег <form> и другие вещи. Но я не могу видеть поля в поле. от и до полей

NGrdanjski 14.05.2019 10:31

попробуй <li> {{ form_errors(fields) }} {{ form_errors(fields.from) }} {{ form_widget(fields.from) }} {{ form_errors(fields.to) }} {{ form_widget(fields.to) }} </li>

Max P. 14.05.2019 10:33

Не работай. Визуализируйте этикетку и div с атрибутом data-prototype, заполненным некоторым html-кодом. И визуализировать кнопку отправки, но без полей из коллекции

NGrdanjski 14.05.2019 10:38

Кажется, поле данных пусто. Попробуйте установить какое-нибудь тестовое значение. Пример: [{"to": "01/16/2010", "from": "12/31/2009"}, {"to": "02/16/2011", "from": "02/10/2011"}]. Также очистите кеш метаданных доктрины php ./bin/console doctrine:cache:clear-metadata

Max P. 14.05.2019 10:40

Работает! Tnx много!

NGrdanjski 14.05.2019 10:56

Другие вопросы по теме