Доступ к Entity Manager внутри класса миграции Symfony 5?

Я добавил новость в свою таблицу, а внутри метода postUp() я хочу обновить все свои потоки.

Как я могу получить доступ к EntityManager внутри моего класса миграции, чтобы получить все мои потоки, обновить их и сохранить/сбросить мои изменения, пожалуйста?

Отвечает ли это на ваш вопрос? Используйте EntityManager в файле миграции

Nico Haase 18.12.2020 22:10
Стоит ли изучать 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
1
1 452
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Инструмент миграции Doctrine предназначен для выполнения SQL-запросов для вас, чтобы изменить схему вашей базы данных. Это не имеет ничего общего с вашими постоянными объектами, поскольку работает на уровне базы данных, а не на уровне ORM. Вы можете написать SQL-запросы для обновления связанных записей базы данных. Кроме того, вы можете использовать подключение к базе данных в сценарии миграции, чтобы получить необходимые данные из базы данных. Вот простой пример, чтобы дать вам отправную точку.

foreach ($this->connection->fetchAll('SELECT id FROM table') as $id) {
    $ids = $this->connection->fetchAll(
        'SELECT some_id FROM another_table WHERE whatever_id = :whateverId GROUP BY some_id',
        [
            'whateverId' => $id['id']
        ]
    );

    $this->addSql(
        'UPDATE table_to_update SET some_field = :someField WHERE id = :some_id',
        [
            'someField' => implode(
                ',',
                array_map(
                    static function (array $data) {
                        return $data['some_id'];
                    },
                    $ids
                )
            ),
            'some_id' => $id['id']
        ]
    );
}

В качестве альтернативы в случае, если вы абсолютно не можете решить свою проблему без доступа к вашим постоянным объектам (например, если вам нужно применить некоторую бизнес-логику в рамках миграции или логика миграции выходит за рамки простого изменения схемы), лучше написать ️ 🔁 Консольная команда Symfony и добавьте EntityManager, репозитории и все, что вам может понадобиться. Эта консольная команда будет выполнена один раз, чтобы применить сложную миграцию, а затем будет выведена из эксплуатации в следующем выпуске.

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