Missing version reference for foreign key column product.id for definition association my_entity.product

Hallo zusammen,

ich habe eine OneToOneAssociation meiner Entity zu product erstellt.

Das FkField befindet sich bei meiner Entity. Soweit funktioniert die Association auch einwandfrei. Jedoch bekomme ich mit dal:validate den Fehler:

Missing version reference for foreign key column product.id for definition association my_entity.product

Was fehlt hier noch auf Seiten meiner Entity? Ich werde aus der product version nicht schlau.

Viele Grüße

Luca

Für eine Association müssen alle primary keys angegeben werden, welche in products eine Kombination aus id und version_id ist.

Moin Alex,

Hier meine Migration:

$connection->executeStatement("
            CREATE TABLE IF NOT EXISTS `my_entity` (
          `id` BINARY(16) NOT NULL,
          `product_id` BINARY(16) NOT NULL,
          `css_class` VARCHAR(255) NULL,
          `created_at` DATETIME(3) NOT NULL,
          `updated_at` DATETIME(3) NULL,
            PRIMARY KEY (`id`, `product_id`),
          CONSTRAINT `fk.my_entity.product_id` FOREIGN KEY (`product_id`)
            REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
        ");

Wie würde die Migration demnach aussehen? product_id ist schon drin. Aber version_id würde ja eine neue Spalte bedeuten. Einen weiteren foreign key aus product lässt er mich aber nicht hinzufügen.

LG Luca

wieso nicht?

CREATE TABLE IF NOT EXISTS `my_entity` (
    `id` BINARY(16) NOT NULL,
    `product_id` BINARY(16) NOT NULL,
    `product_version_id` BINARY(16) NOT NULL,
    `css_class` VARCHAR(255) NULL,
    `created_at` DATETIME(3) NOT NULL,
    `updated_at` DATETIME(3) NULL,
    PRIMARY KEY (`id`, `product_id`, `product_version_id`),
    CONSTRAINT `fk.my_entity.product_id__product_version_id` FOREIGN KEY (`product_id`, `product_version_id`)
        REFERENCES `product` (`id`, `version_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
1 Like

Hat geklappt, ich hatte einen Tippfehler in der CONSTRAINT.

Ich danke dir vielmals!

Zur Vollständigkeit hier noch meine EntityDefinition, die den Fehler mit einem ReferenceVersionField behebt:

return new FieldCollection([
            (new IdField("id", "id"))->addFlags(new ApiAware(), new PrimaryKey(), new Required()),
            (new ReferenceVersionField(ProductDefinition::class, "product_version_id"))->addFlags(new ApiAware(), new Required()),
            (new FkField("product_id", "productId", ProductDefinition::class))->addFlags(new ApiAware(), new Required()),
            (new StringField("css_class", "cssClass"))->addFlags(new ApiAware()),
            (new OneToOneAssociationField("product", "product_id", "id", ProductDefinition::class, false))->addFlags(new ApiAware()),
        ]);