Magento 2:コレクションをウォークスルーして削除する


8

Magento 2のコレクションを調べ、データベースからエントリを削除する方法があるかどうか疑問に思っていました。

Magento 1では、これは次のようなことで実現できます。

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

Magento 2で同様のことを達成する方法はありますか?

回答:


25

8

私は簡単に間違っている可能性がありますが、それはあなたが働いているエンティティに依存すると思います。コアからいくつかの参照を取得します。例:

\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');
}

エンティティにサービス層の設定があるかどうかにかかっています。


それは
まあまあの

2
うん、私の投稿は明らかに数時間待っていた。ほとんどの場合、私はそれについてのすべてを忘れて、実際に「ポスト」をクリックしたことがないので
benmarks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.