2015-12-14 2 views
1

как вы создаете триггеры sql с миграциями доктрины?Ошибка миграции в Doctrine - «отношения не существует»

здесь является миграция:

<?php 
namespace App\Migrations; 

use Doctrine\DBAL\Migrations\AbstractMigration; 
use Doctrine\DBAL\Schema\Schema; 
use Doctrine\DBAL\Schema\Table; 

/** 
* Auto-generated Migration: Please modify to your needs! 
*/ 
class Version20151211173441 extends AbstractMigration 
{ 
    /** 
    * @param Schema $schema 
    */ 
    public function up(Schema $schema) 
    { 
     $table = $schema->createTable('public.users'); 
     $table->addColumn('id', 'integer', [ 
      'autoincrement' => true 
     ]); 
     $table->addColumn('name', 'string'); 
     $table->setPrimaryKey(['id']); 

     $this->addSql(" 
      CREATE OR REPLACE FUNCTION public.users_insert_trigger() 
       RETURNS TRIGGER AS $$ 
       BEGIN 
        NEW.name := NEW.name || ' test'; 
        RETURN NEW; 
       END; 
       $$ 
       LANGUAGE plpgsql; 
     "); 

     $this->addSql(" 
      CREATE TRIGGER users_on_insert_trigger 
       BEFORE INSERT ON public.users 
       FOR EACH ROW EXECUTE PROCEDURE public.users_insert_trigger(); 
     "); 
    } 

    /** 
    * @param Schema $schema 
    */ 
    public function down(Schema $schema) 
    { 
     $this->addSql("DROP TRIGGER public.users_on_insert_trigger ON users"); 
     $this->addSql("DROP FUNCTION public.users_insert_trigger()"); 
     $schema->dropTable('users'); 
    } 
} 

Это производит следующее сообщение об ошибке:

SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "public.users" does not exist

и производит следующий SQL:

CREATE OR REPLACE FUNCTION public.users_insert_trigger() 
    RETURNS TRIGGER AS $$ 
    BEGIN 
     NEW.name := NEW.name || ' test'; 
     RETURN NEW; 
    END; 
    $$ 
    LANGUAGE plpgsql; 

CREATE TRIGGER users_on_insert_trigger 
    BEFORE INSERT ON public.users 
    FOR EACH ROW EXECUTE PROCEDURE public.users_insert_trigger(); 

CREATE TABLE public.users (id SERIAL NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)); 
INSERT INTO common.migrations (version) VALUES ('20151211173441'); 

Если я правильно понимаю, изменения в схеме является применяется в конце миграции. Но это меня не устраивает ...

Итак, как я могу справиться с этим?

ответ

1

Вы правильно суммировали проблему: бегун миграции фактически выполняет SQL, который вы добавляете через addSQL(), прежде чем SQL сгенерирован с использованием схем.

Вам необходимо внести это изменение в две отдельные миграции.

0

нормально, я нашел 2 смежные вопросы:

так что вы можете:

  1. как сказал @wschalle, вы можете справиться с ними миграция
  2. другой способ - не используют схемы для миграции (я предпочитаю)

без схемы вы миграционным выглядеть

<?php 

public function up(Schema $schema) 
{ 
    $platform = $this->connection->getSchemaManager()->getDatabasePlatform(); 

    $table = new Table('table_name'/*, ...*/); 
    // ... 

    $sql = $platform->getCreateTableSQL($table); 
    // or 
    $sql = $platform->getDropTableSQL($table); 
    // etc. 

    $this->addSql($sql); 
} 
Смежные вопросы