addSql(<<<'SQL' CREATE TABLE category_type ( id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, code VARCHAR(40) NOT NULL, label VARCHAR(120) NOT NULL, PRIMARY KEY (id) ) SQL); $this->addSql('CREATE UNIQUE INDEX uq_category_type_code ON category_type (code)'); $this->addSql(<<<'SQL' CREATE TABLE category ( id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, name VARCHAR(120) NOT NULL, category_type_id INT NOT NULL, deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updated_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, created_by INT DEFAULT NULL, updated_by INT DEFAULT NULL, PRIMARY KEY (id), CONSTRAINT fk_category_type FOREIGN KEY (category_type_id) REFERENCES category_type (id) ON DELETE RESTRICT, CONSTRAINT fk_category_created_by FOREIGN KEY (created_by) REFERENCES "user" (id) ON DELETE SET NULL, CONSTRAINT fk_category_updated_by FOREIGN KEY (updated_by) REFERENCES "user" (id) ON DELETE SET NULL ) SQL); // Unicite (name, type) case-insensitive, seulement sur les non-soft-deleted. $this->addSql(<<<'SQL' CREATE UNIQUE INDEX uq_category_name_type_active ON category (LOWER(name), category_type_id) WHERE deleted_at IS NULL SQL); $this->addSql('CREATE INDEX idx_category_deleted_at ON category (deleted_at)'); $this->addSql('CREATE INDEX idx_category_type_id ON category (category_type_id)'); $this->addSql('CREATE INDEX idx_category_created_by ON category (created_by)'); $this->addSql('CREATE INDEX idx_category_updated_by ON category (updated_by)'); } public function down(Schema $schema): void { // Ordre important : `category` porte les FK vers `category_type`. $this->addSql('DROP TABLE category'); $this->addSql('DROP TABLE category_type'); } }