@anna_makeenko

Как заполнить таблицу базы данных в symfony?

Предположим, что в одной из таблиц должны быть данные по умолчанию, например список свойств объекта. Чтобы заполнить таблицу базы данных нужно использовать миграции? Сырой SQL запрос?

P.S. Symfony 5
  • Вопрос задан
  • 704 просмотра
Пригласить эксперта
Ответы на вопрос 4
kspitfire
@kspitfire
Webdev: PHP (Symfony, Laravel), JS (Vue.js), Go.
Использовать нужно фикстуры: https://symfony.com/doc/master/bundles/DoctrineFix...
Ответ написан
passionkillah
@passionkillah
Backend-разработчик
Обычно я, при необходимости заполнить БД, использую миграции, где пишу запросы на чистом SQL. Не стоит вызывать EntityManager и тем более протаскивать контейнер целиком в миграции, как писали выше - это плохая практика.
Фикстуры, как здесь уже написали, - тестовая история, хотя никто вам не запрещает их использовать.
Ответ написан
Комментировать
Для структуры юзай миграции, для её некоторого нчального наполнения - фикстуры
Ответ написан
@anna_makeenko Автор вопроса
Есть такой вариант:

In some cases you might need access to the container to ensure the proper update of your data structure. This could be necessary to update relations with some specific logic or to create new entities.

Therefore you can just implement the ContainerAwareInterface with its needed methods to get full access to the container or ContainerAwareTrait.

// ...
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class Version20130326212938 extends AbstractMigration implements ContainerAwareInterface
{
    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function up(Schema $schema)
    {
        // ... migration content
    }

    public function postUp(Schema $schema)
    {
        $converter = $this->container->get('my_service.convert_data_to');
        // ... convert the data from markdown to html for instance
    }
}


// ...
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;

class Version20130326212938 extends AbstractMigration implements ContainerAwareInterface
{
    use ContainerAwareTrait;

    public function up(Schema $schema)
    {
        // ... migration content
    }

    public function postUp(Schema $schema)
    {
        $converter = $this->container->get('my_service.convert_data_to');
        // ... convert the data from markdown to html for instance
    }
}




// ...
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;

class Version20130326212938 extends AbstractMigration implements ContainerAwareInterface
{
    use ContainerAwareTrait;

    public function up(Schema $schema)
    {
        // ... migration content
    }

    public function postUp(Schema $schema)
    {
        $em = $this->container->get('doctrine.orm.entity_manager');
        // ... update the entities
    }
}


https://stackoverflow.com/questions/19502630/use-e...
https://symfony.com/doc/current/bundles/DoctrineMi...

Но вот здесь пишут, что это может привести к проблемам в будущем:
https://stackoverflow.com/questions/31878323/add-d...
Ответ написан
Ваш ответ на вопрос

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

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