Skip to content

Commit c0d0f76

Browse files
authored
LYNX-290: Bulk quote_shipping_rate delete (#174)
1 parent 01fd80b commit c0d0f76

File tree

2 files changed

+102
-4
lines changed

2 files changed

+102
-4
lines changed

app/code/Magento/Quote/Model/ResourceModel/Quote/Address/Rate/Collection.php

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
*/
66
namespace Magento\Quote\Model\ResourceModel\Quote\Address\Rate;
77

8+
use Magento\Quote\Model\ResourceModel\Quote\Address\Rate;
9+
810
/**
911
* Quote addresses shipping rates collection
1012
*
11-
* @author Magento Core Team <core@magentocommerce.com>
13+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1214
*/
1315
class Collection extends \Magento\Framework\Model\ResourceModel\Db\VersionControl\Collection
1416
{
@@ -24,15 +26,21 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\VersionContro
2426
*/
2527
private $_carrierFactory;
2628

29+
/**
30+
* @var Delete
31+
*/
32+
private Delete $deleteRates;
33+
2734
/**
2835
* @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
2936
* @param \Psr\Log\LoggerInterface $logger
3037
* @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
3138
* @param \Magento\Framework\Event\ManagerInterface $eventManager
3239
* @param \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot $entitySnapshot
3340
* @param \Magento\Shipping\Model\CarrierFactoryInterface $carrierFactory
34-
* @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
35-
* @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
41+
* @param Delete $deleteRates
42+
* @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
43+
* @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb|null $resource
3644
*/
3745
public function __construct(
3846
\Magento\Framework\Data\Collection\EntityFactory $entityFactory,
@@ -41,8 +49,9 @@ public function __construct(
4149
\Magento\Framework\Event\ManagerInterface $eventManager,
4250
\Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot $entitySnapshot,
4351
\Magento\Shipping\Model\CarrierFactoryInterface $carrierFactory,
52+
Delete $deleteRates,
4453
\Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
45-
\Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
54+
\Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null,
4655
) {
4756
parent::__construct(
4857
$entityFactory,
@@ -53,6 +62,7 @@ public function __construct(
5362
$connection,
5463
$resource
5564
);
65+
$this->deleteRates = $deleteRates;
5666
$this->_carrierFactory = $carrierFactory;
5767
}
5868

@@ -112,4 +122,27 @@ public function addItem(\Magento\Framework\DataObject $rate)
112122
}
113123
return parent::addItem($rate);
114124
}
125+
126+
/**
127+
* @inheritdoc
128+
*/
129+
public function save()
130+
{
131+
$itemsToDelete = [];
132+
$itemsToSave = [];
133+
/** @var Rate $item */
134+
foreach ($this->getItems() as $item) {
135+
if ($item->isDeleted()) {
136+
$itemsToDelete[] = $item;
137+
} else {
138+
$itemsToSave[] = $item;
139+
}
140+
}
141+
$this->deleteRates->execute($itemsToDelete);
142+
/** @var Rate $item */
143+
foreach ($itemsToSave as $item) {
144+
$item->save();
145+
}
146+
return $this;
147+
}
115148
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
/************************************************************************
3+
*
4+
* Copyright 2023 Adobe
5+
* All Rights Reserved.
6+
*
7+
* NOTICE: All information contained herein is, and remains
8+
* the property of Adobe and its suppliers, if any. The intellectual
9+
* and technical concepts contained herein are proprietary to Adobe
10+
* and its suppliers and are protected by all applicable intellectual
11+
* property laws, including trade secret and copyright laws.
12+
* Dissemination of this information or reproduction of this material
13+
* is strictly forbidden unless prior written permission is obtained
14+
* from Adobe.
15+
* ***********************************************************************
16+
*/
17+
declare(strict_types=1);
18+
19+
namespace Magento\Quote\Model\ResourceModel\Quote\Address\Rate;
20+
21+
use Magento\Framework\App\ResourceConnection;
22+
use Magento\Quote\Model\Quote\Address\Rate;
23+
24+
class Delete
25+
{
26+
private const TABLE = 'quote_shipping_rate';
27+
private const FIELD_RATE_ID = 'rate_id';
28+
29+
/**
30+
* @var ResourceConnection
31+
*/
32+
private ResourceConnection $resourceConnection;
33+
34+
/**
35+
* @param ResourceConnection $resourceConnection
36+
*/
37+
public function __construct(ResourceConnection $resourceConnection)
38+
{
39+
$this->resourceConnection = $resourceConnection;
40+
}
41+
42+
/**
43+
* Remove shipping rates
44+
*
45+
* @param Rate[] $rates
46+
* @return void
47+
*/
48+
public function execute(array $rates): void
49+
{
50+
if (empty($rates)) {
51+
return;
52+
}
53+
$this->resourceConnection->getConnection()->delete(
54+
$this->resourceConnection->getTableName(self::TABLE),
55+
[
56+
self::FIELD_RATE_ID . ' IN (?)' => array_map(
57+
function ($rate) {
58+
return $rate->getId();
59+
},
60+
$rates
61+
)
62+
]
63+
);
64+
}
65+
}

0 commit comments

Comments
 (0)