Search code examples
javascriptdatabaseshopwareshopware6

Shopware 6 : Delete data with custom Administration


I want remove Data of table 'filter_object' with related table 'filter_link' bevor starting the action of button onClickSync(). The 'filter_link' table contains two foreign key : product_id and object_id.

I tried to delete the data by id in a for loop, but this only deletes the data from the 'filter_object' table without related product. In addition it slows down the deletion when I have several data. Could help me please ?

import template from './sw-vehicles-list.html.twig';

const { Component } = Shopware;
const { Criteria } = Shopware.Data;

Component.register('sw-vehicles-list', {
    template,
    inject: ['repositoryFactory'],
    data() {
        return {
            repository: null,
            showAddButton: true,
            isLoading: false,
            object: null,
        };
    },
    metaInfo() {
        return {
            title: this.$createTitle()
        };
    },
    computed: {
        filterObjectRepository() {
            return this.repositoryFactory.create('filter_object');
        },
        filterLinkRepository() {
            return this.repositoryFactory.create('filter_link');
        },
        productRepository() {
            return this.repositoryFactory.create('product');
        },
    },
    created() {
        this.object = this.repositoryFactory.create('filter_object');
        this.link = this.repositoryFactory.create('filter_link');
    },
    methods: {
        async onClickSync() {

            this.isLoading = true;
            await this.removeData();

            this.repository.search(new Criteria(), Shopware.Context.api).then((result) => {
                if (result.length) {
                    var i;
                    var manufacturer = [];
                    for (i = 0; i < result.length; i++) {
                        manufacturer.push(result[i]['manufacturer']);
                    }
                    var manufacturerFilter = Array.from(new Set(manufacturer));

                    var j;
                    for ( j = 0; j < manufacturerFilter.length; j++) {
                        // some code                       
                    }
                }
            });
        },

        removeData() {
            return this.filterObjectRepository.search(new Criteria(), Shopware.Context.api).then((result) => {
                if (result.length) {
                    var i;
                    for (i = 0; i < result.length; ++i) {
                        this.filterObjectRepository.delete(result[i]['id'], Shopware.Context.api).then(this.loadObject);
                    }
                    return null;                  
                }
            });
        },

        loadObject() {
            this.filterObjectRepository.search(new Criteria(), Shopware.Context.api).then((result) => {
                this.result = result;
            });
        },

    }
});

Solution

  • You can use the syncDeleted method of the repository to delete multiple records.

    const ids = result.map(record => record.id);
    this.filterObjectRepository.syncDeleted(ids, Shopware.Context.api)
    

    If you want filter_link records to be deleted when deleting records from filter_object you'll have to set the foreign keys ON DELETE subclause to CASCADE.

    ALTER TABLE `filter_link` 
    DROP FOREIGN KEY `fk.filter_link.object_id`;
    ALTER TABLE `filter_link` 
    ADD CONSTRAINT `fk.filter_link.object_id` FOREIGN KEY (`object_id`) REFERENCES `filter_object` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;