99use Magento \Eav \Model \Config ;
1010use Magento \Framework \App \State ;
1111use Magento \Quote \Model \QuoteFactory ;
12+ use Magento \Sales \Model \Order \Address ;
1213use Magento \Sales \Model \OrderFactory ;
1314use Magento \Sales \Model \ResourceModel \Order \Address \CollectionFactory as AddressCollectionFactory ;
1415use Magento \Framework \App \ResourceConnection ;
@@ -39,23 +40,11 @@ class FillQuoteAddressIdInSalesOrderAddress implements DataPatchInterface, Patch
3940 */
4041 private $ eavConfig ;
4142
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-
5743 /**
5844 * PatchInitial constructor.
45+ *
46+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
47+ *
5948 * @param ModuleDataSetupInterface $moduleDataSetup
6049 */
6150 public function __construct (
@@ -71,9 +60,6 @@ public function __construct(
7160 $ this ->salesSetupFactory = $ salesSetupFactory ;
7261 $ this ->state = $ state ;
7362 $ this ->eavConfig = $ eavConfig ;
74- $ this ->addressCollectionFactory = $ addressCollectionFactory ;
75- $ this ->orderFactory = $ orderFactory ;
76- $ this ->quoteFactory = $ quoteFactory ;
7763 }
7864
7965 /**
@@ -96,28 +82,8 @@ public function apply()
9682 */
9783 public function fillQuoteAddressIdInSalesOrderAddress (ModuleDataSetupInterface $ setup )
9884 {
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 );
12187 }
12288
12389 /**
@@ -145,4 +111,88 @@ public function getAliases()
145111 {
146112 return [];
147113 }
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+ }
148198}
0 commit comments