Cannot add or update a child row: a foreign key constraint fails

 

Hallo.

Ich habe eine neue Entity inkl. Translation AssignedProducts Tabelle angelegt und die Produkt Entity um diese Entity erweitert. Ähnlich wie beim Crosselling kann ich Einträge aus der neuen Entity beim Produkt auswählen. Das klappt auch nach Stunden hin und her jetzt auch wunderbar. Leider lässt sich das Produkt nicht mehr speichern nachdem Einträge zugewiesesn wurden. Grund ist ein SQL Fehler mit einem Constraint:

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (shopware.bst_text_builder_assigned_products, CONSTRAINT fk.bst_text_builder_assigned_products.text_builder_id FOREIGN KEY (text_builder_id) REFERENCES bst_text_builder

Constraint in der Migration:

CONSTRAINT `fk.bst_text_builder_assigned_products.text_builder_id`
                    FOREIGN KEY (`text_builder_id`) REFERENCES `bst_text_builder` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

Sobald ein neuer Eintrag beim Produkt zugewiesen wird, wird eine neue Instanz der Entity erzeugt und mit den aktuellen Produktdaten versorgt. Wenn ich mir das per console.log() ausgeben lasse sehen alle IDs (binaries) korrekt aus. Untersuche ich den Fehler 500 (Integrity constraint violation) sehen die Ids aber wie folgt aus: 

An exception occurred while executing 'INSERT INTO `bst_text_builder_assigned_products` (`product_version_id`, `id`, `text_builder_id`, `product_id`, `created_at`) VALUES (?, ?, ?, ?, ?)' with params ["\x0f\xa9\x1c\xe3\xe9\x6a\x4b\xc2\xbe\x4b\xd9\xce\x75\x2c\x34\x25", "\xcf\x18\x43\xa5\xc3\xae\x48\x31\x98\xbf\xa4\x70\x4c\x2a\x3e\x60", "\x00\x6b\x62\xb0\x9c\xcb\x44\xe2\x87\x05\xc3\xd7\x2d\xb1\x4a\x96", "\x3a\xcb\xaf\x38\xc5\x94\x46\x55\xbd\x29\xd8\x95\x98\xf0\x7b\x31", "2021-01-05 12:00:03.698"]:↵↵SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`shopware`.`bst_text_builder_assigned_products`, CONSTRAINT `fk.bst_text_builder_assigned_products.text_builder_id` FOREIGN KEY (`text_builder_id`) REFERENCES `bst_text_builder` (`id`)

{`product_version_id`: "©ãéjK¾KÙÎu,4%",…}
`created_at`: "2021-01-05 12:22:18.124"
`id`: "ATTENTION: Converted binary string by the "Shopware\Core\Framework\Api\EventListener\ErrorResponseFactory": 30ab424fa3424dfbaf07c02071b26fb3"
`product_id`: ":˯8ŔFU½)ؕ˜ð{1"
`product_version_id`: "©ãéjK¾KÙÎu,4%"
`text_builder_id`: "œ½¶±¤ÆG}­ŠË -˜+œ"

Denke da liegt das Problem das die IDs nicht korrekt an die DB gesendet werden. Warum werden diese IDs so umgewandelt. wie kann ich das umgehen? Hier der Auszug aus dem JS zum Erzeugen eines neuen Eintrags/Mappings:

onToggleItem(itemId) {
	if (itemId === null) {
		return;
	}
	this.isLoadingData = true;
	const matchedAssignedItem = this.assignedProducts.find((assignedItem) => {
		return assignedItem.textBuilderId === itemId;
	});

	if (matchedAssignedItem) {
		this.removeItem(matchedAssignedItem);
		this.isLoadingData = false;
	} else {
		const newItem = this.assignmentRepository.create();
		newItem.textBuilderId = itemId;
		newItem.position = this.assignedProducts.length + 1;
		newItem.productId = this.product.id;
		newItem.product = this.product;
		this.isLoadingData = false;

		this.assignedProducts.add(newItem);
		this.textBuilderRepository.get(itemId, { ...Context.api, inheritance: true }).then((productText) => {
			newItem.textBuilder = productText;
			this.isLoadingData = false;
		});
	}
},

Hier das Template zur Auswahl der Einträge beim Produkt:

    {% block bst_textbuilder_assignment_container %}
        
            {% block bst_textbuilder_assignment_select %}
                

                    
                        
                            
                                {% block sw_entity_single_select_base_results_list_result_label %}
                                    
                                        {{ item.translated.name || item.name }}
                                    
                                {% endblock %}
                            
                        
                    

                
            {% endblock %}

            {% block bst_textbuilder_assignment_option_grid %}
                

                    
                        
                            {{ $tc('global.default.delete') }}
                        
                    

                    
                        {% block sw_data_grid_columns_render_value %}
                            
                                {{ item.textBuilder.translated.name || item.textBuilder.name }}
                            
                        {% endblock %}
                    

                    {% block bst_textbuilder_assignment_option_grid_column_position %}
                        
                            
                            
                        
                    {% endblock %}
                
            {% endblock %}
            {% block bst_textbuilder_assignment_empty_state %}
                
                        
                            
                        
                
            {% endblock %}
        
    {% endblock %}

Wie gesagt habe ich mich sehr stark am Code des Crossselling Moduls orientiert. Dort funktioniert es ja auch problemlos :frowning:

 

Gruß Mike