Magento 2: Percorra a coleção e exclua

8

Fiquei me perguntando se havia uma maneira de percorrer uma coleção no Magento 2 e excluir entradas das bases de dados e.

No Magento 1, isso pode ser feito fazendo o seguinte:

Mage::getModel('foo/bar')->getCollection()
                    ->addFilter('baz', $filter)
                    ->walk('delete')

Existe uma maneira de conseguir algo semelhante no Magento 2?

Richard Cripps
fonte

Respostas:

8

Eu poderia facilmente estar errado, mas acho que depende da entidade com a qual você está trabalhando. Pegue algumas referências do núcleo, por exemplo:

\Magento\Eav\Model\Entity\Collection\AbstractCollection::delete()

public function delete()
{
    foreach ($this->getItems() as $key => $item) {
        $this->getEntity()->delete($item);
        unset($this->_items[$key]);
    }
    return $this;
}

\Magento\Customer\Controller\Adminhtml\Index\MassDelete::massAction():

protected function massAction(AbstractCollection $collection)
{
    $customersDeleted = 0;
    foreach ($collection->getAllIds() as $customerId) {
        $this->customerRepository->deleteById($customerId);
        $customersDeleted++;
    }
    //snip...
}

\Magento\Catalog\Controller\Adminhtml\Product\MassDelete::execute()

public function execute()
{
    $collection = $this->filter->getCollection($this->collectionFactory->create());
    $productDeleted = 0;
    foreach ($collection->getItems() as $product) {
        $product->delete();
        $productDeleted++;
    }
    $this->messageManager->addSuccess(
        __('A total of %1 record(s) have been deleted.', $productDeleted)
    );

    return $this->resultFactory->create(ResultFactory::TYPE_REDIRECT)->setPath('catalog/*/index');
}

Tudo se resume a se há uma camada de serviço configurada para a entidade.

benmarks
fonte
Ele soa sobre a direita, a minha resposta foi específica para o caso OP como parece que ele / ela costumava fazer isso com uma entidade de volta personalizado em M1
Raphael em Digital pianismo
2
Sim, o meu evidentemente esperou horas para publicar. Muito provavelmente porque eu esqueci tudo sobre ele e nunca realmente clicou "post"
benmarks