Doctrine2-Migration mit DBAL anstelle von $ this-> addSql

Daher habe ich eine Reihe von Doctrine2-Migrationen durchgeführt (https://github.com/doctrine/migrations), aber ich habe eine Frage zu einer neuen Migration, die ich durchführen möchte.

Ich habe ein bisschen in der Bibliothek gebuddelt und das sehe ich$this->addSql() wird verwendet, um eine Liste der auszuführenden SQL-Anweisungen zu erstellen, die später ausgeführt werden.

Ich wollte etwas tun, bei dem ich einige Daten auswähle, über die Zeilen iteriere, basierend darauf neue Daten einfüge und dann die von mir ausgewählten Daten lösche. Dies eignet sich ziemlich leicht für die DBAL-Bibliothek, aber ich frage mich, ob ich das verwenden kannprotected $connection in einer Migration sicher? Oder ist das schlecht, weil es Anweisungen vor einer meiner ausführen würde?$this->addSql() SQL wird ausgeführt? Auch es scheint so, als würde das brechendry-run Einstellung von dem, was ich im Code gesehen habe. Hat jemand Erfahrung mit dieser Art der Migration? Gibt es Best Practices?

Das Folgende ist die Migration, die ich durchführen möchte, aber ich bin nicht sicher, ob dies von Doctrine Migrations unterstützt wird:

<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>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage