9
9
use Magento \Eav \Model \Config ;
10
10
use Magento \Framework \App \State ;
11
11
use Magento \Quote \Model \QuoteFactory ;
12
+ use Magento \Sales \Model \Order \Address ;
12
13
use Magento \Sales \Model \OrderFactory ;
13
14
use Magento \Sales \Model \ResourceModel \Order \Address \CollectionFactory as AddressCollectionFactory ;
14
15
use Magento \Framework \App \ResourceConnection ;
@@ -39,23 +40,11 @@ class FillQuoteAddressIdInSalesOrderAddress implements DataPatchInterface, Patch
39
40
*/
40
41
private $ eavConfig ;
41
42
42
- /**
43
- * @var AddressCollectionFactory
44
- */
45
- private $ addressCollectionFactory ;
46
-
47
- /**
48
- * @var OrderFactory
49
- */
50
- private $ orderFactory ;
51
-
52
- /**
53
- * @var QuoteFactory
54
- */
55
- private $ quoteFactory ;
56
-
57
43
/**
58
44
* PatchInitial constructor.
45
+ *
46
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
47
+ *
59
48
* @param ModuleDataSetupInterface $moduleDataSetup
60
49
*/
61
50
public function __construct (
@@ -71,9 +60,6 @@ public function __construct(
71
60
$ this ->salesSetupFactory = $ salesSetupFactory ;
72
61
$ this ->state = $ state ;
73
62
$ this ->eavConfig = $ eavConfig ;
74
- $ this ->addressCollectionFactory = $ addressCollectionFactory ;
75
- $ this ->orderFactory = $ orderFactory ;
76
- $ this ->quoteFactory = $ quoteFactory ;
77
63
}
78
64
79
65
/**
@@ -96,28 +82,8 @@ public function apply()
96
82
*/
97
83
public function fillQuoteAddressIdInSalesOrderAddress (ModuleDataSetupInterface $ setup )
98
84
{
99
- $ addressTable = $ setup ->getTable ('sales_order_address ' );
100
- $ updateOrderAddress = $ setup ->getConnection ()
101
- ->select ()
102
- ->joinInner (
103
- ['sales_order ' => $ setup ->getTable ('sales_order ' )],
104
- $ addressTable . '.parent_id = sales_order.entity_id ' ,
105
- ['quote_address_id ' => 'quote_address.address_id ' ]
106
- )
107
- ->joinInner (
108
- ['quote_address ' => $ setup ->getTable ('quote_address ' )],
109
- 'sales_order.quote_id = quote_address.quote_id
110
- AND ' . $ addressTable . '.address_type = quote_address.address_type ' ,
111
- []
112
- )
113
- ->where (
114
- $ addressTable . '.quote_address_id IS NULL '
115
- );
116
- $ updateOrderAddress = $ setup ->getConnection ()->updateFromSelect (
117
- $ updateOrderAddress ,
118
- $ addressTable
119
- );
120
- $ setup ->getConnection ()->query ($ updateOrderAddress );
85
+ $ this ->fillQuoteAddressIdInSalesOrderAddressByType ($ setup , Address::TYPE_SHIPPING );
86
+ $ this ->fillQuoteAddressIdInSalesOrderAddressByType ($ setup , Address::TYPE_BILLING );
121
87
}
122
88
123
89
/**
@@ -145,4 +111,88 @@ public function getAliases()
145
111
{
146
112
return [];
147
113
}
114
+
115
+ /**
116
+ * @param ModuleDataSetupInterface $setup
117
+ * @param string $addressType
118
+ */
119
+ private function fillQuoteAddressIdInSalesOrderAddressByType (ModuleDataSetupInterface $ setup , $ addressType )
120
+ {
121
+ $ salesConnection = $ setup ->getConnection ('sales ' );
122
+
123
+ $ orderTable = $ setup ->getTable ('sales_order ' , 'sales ' );
124
+ $ orderAddressTable = $ setup ->getTable ('sales_order_address ' , 'sales ' );
125
+
126
+ $ query = $ salesConnection
127
+ ->select ()
128
+ ->from (
129
+ ['sales_order_address ' => $ orderAddressTable ],
130
+ ['entity_id ' , 'address_type ' ]
131
+ )
132
+ ->joinInner (
133
+ ['sales_order ' => $ orderTable ],
134
+ 'sales_order_address.parent_id = sales_order.entity_id ' ,
135
+ ['quote_id ' => 'sales_order.quote_id ' ]
136
+ )
137
+ ->where ('sales_order_address.quote_address_id IS NULL ' )
138
+ ->where ('sales_order_address.address_type = ? ' , $ addressType )
139
+ ->order ('sales_order_address.entity_id ' );
140
+
141
+ $ batchSize = 5000 ;
142
+ $ result = $ salesConnection ->query ($ query );
143
+ $ count = $ result ->rowCount ();
144
+ $ batches = ceil ($ count / $ batchSize );
145
+
146
+ for ($ batch = $ batches ; $ batch > 0 ; $ batch --) {
147
+ $ query ->limitPage ($ batch , $ batchSize );
148
+ $ result = $ salesConnection ->fetchAssoc ($ query );
149
+
150
+ $ this ->fillQuoteAddressIdInSalesOrderAddressProcessBatch ($ setup , $ result , $ addressType );
151
+ }
152
+ }
153
+
154
+ /**
155
+ * @param ModuleDataSetupInterface $setup
156
+ * @param array $orderAddresses
157
+ * @param string $addressType
158
+ */
159
+ private function fillQuoteAddressIdInSalesOrderAddressProcessBatch (
160
+ ModuleDataSetupInterface $ setup ,
161
+ array $ orderAddresses ,
162
+ $ addressType
163
+ ) {
164
+ $ salesConnection = $ setup ->getConnection ('sales ' );
165
+ $ quoteConnection = $ setup ->getConnection ('checkout ' );
166
+
167
+ $ quoteAddressTable = $ setup ->getTable ('quote_address ' , 'checkout ' );
168
+ $ quoteTable = $ setup ->getTable ('quote ' , 'checkout ' );
169
+ $ salesOrderAddressTable = $ setup ->getTable ('sales_order_address ' , 'sales ' );
170
+
171
+ $ query = $ quoteConnection
172
+ ->select ()
173
+ ->from (
174
+ ['quote_address ' => $ quoteAddressTable ],
175
+ ['quote_id ' , 'address_id ' ]
176
+ )
177
+ ->joinInner (
178
+ ['quote ' => $ quoteTable ],
179
+ 'quote_address.quote_id = quote.entity_id ' ,
180
+ []
181
+ )
182
+ ->where ('quote.entity_id in (?) ' , array_column ($ orderAddresses , 'quote_id ' ))
183
+ ->where ('address_type = ? ' , $ addressType );
184
+
185
+ $ quoteAddresses = $ quoteConnection ->fetchAssoc ($ query );
186
+
187
+ foreach ($ orderAddresses as $ orderAddress ) {
188
+ $ bind = [
189
+ 'quote_address_id ' => $ quoteAddresses [$ orderAddress ['quote_id ' ]]['address_id ' ] ?? null ,
190
+ ];
191
+ $ where = [
192
+ 'orderAddressId ' => $ orderAddress ['entity_id ' ]
193
+ ];
194
+
195
+ $ salesConnection ->update ($ salesOrderAddressTable , $ bind , $ where );
196
+ }
197
+ }
148
198
}
0 commit comments