Doctrine2 Migration Używając DBAL zamiast $ this-> addSql

Zrobiłem więc kilka migracji Doctrine2 (https://github.com/doctrine/migrations), ale mam pytanie o nową migrację, którą próbuję zrobić.

Wkopałem trochę do biblioteki i widzę to$this->addSql() służy do zbudowania listy SQL do wykonania, a następnie zostanie wykonana później.

Chciałem zrobić coś, gdzie wybieram dane, iteracyjnie nad wierszami, wstawiam nowe dane na tej podstawie, a następnie usuwam wybrane dane. To bardzo łatwo nadaje się do biblioteki DBAL, ale zastanawiam się, czy mogę użyćprotected $connection w bezpiecznej migracji? Albo jest tak źle, ponieważ wykonałby polecenia przed którymkolwiek z moich$this->addSql() SQL zostanie wykonany? Wygląda na to, że to złamiedry-run ustawienie z tego, co widziałem w kodzie. Czy ktoś miał jakieś doświadczenia z tym typem migracji? Czy są jakieś najlepsze praktyki?

Poniżej znajduje się migracja, którą chcę wykonać, ale nie jestem pewien, czy jest to obsługiwane przez Doctrine Migrations:

<code>public function up(Schema $schema)
{
    // this up() migration is autogenerated, please modify it to your needs
    $this->abortIf($this->connection->getDatabasePlatform()->getName() != "mysql");

    $this->addSql("ALTER TABLE article_enclosures ADD is_scrape TINYINT(1) NOT NULL");
    $this->addSql("ALTER TABLE images DROP FOREIGN KEY FK_E01FBE6AA536AAC7");

    // now lets take all images with a scrape and convert the scrape to an enclosure
    // 
    // Select all images where not scrape_id is null (join on article_image_scrape)
    // for each image:
    //     insert into article_enclosures
    //     update image set enclosure_id = new ID
    //     delete from article_image_scrape where id...
    //
    // insert into article_enclosures select article_image_scrapes...

    $sql = "SELECT i.id img_id, e.* FROM images i JOIN article_image_scrapes e ON i.scrape_id = e.id";
    $stmt = $this->connection->prepare($sql);
    $stmt->execute();
    $scrapesToDelete = array();
    while ($row = $stmt->fetch()) {
        $scrapeArticle = $row['article_id'];
        $scrapeOldId = $row['id'];
        $scrapeUrl = $row['url'];
        $scrapeExtension = $row['extension'];
        $scrapeUrlHash = $row['url_hash'];
        $imageId = $row['image_id'];

        $this->connection->insert('article_enclosures', array(
            'url' => $scrapeUrl,
            'extension' => $scrapeExtension,
            'url_hash' => $scrapeUrlHash
        ));

        $scrapeNewId = $this->connection->lastInsertId();

        $this->connection->update('images', array(
            'enclosure_id' => $scrapeNewId,
            'scrape_id' => null
        ), array(
            'id' => $imageId
        ));

        $scrapesToDelete[] = $scrapeOldId;
    }

    foreach ($scrapesToDelete as $id) {
        $this->connection->delete('article_image_scrapes', array('id' => $id));
    }

    $this->addSql("INSERT INTO article_scrapes (article_id, url, extension, url_hash) "
            ."SELECT s.id, s.url, s.extension, s.url_hash"
            ."FROM article_image_scrapes s");

    $this->addSql("DROP INDEX IDX_E01FBE6AA536AAC7 ON images");
    $this->addSql("ALTER TABLE images DROP scrape_id, CHANGE enclosure_id enclosure_id INT NOT NULL");
}
</code>

questionAnswers(2)

yourAnswerToTheQuestion