-
Notifications
You must be signed in to change notification settings - Fork 9.3k
/
UpdateMultiselectAttributesBackendTypes.php
102 lines (88 loc) · 2.94 KB
/
UpdateMultiselectAttributesBackendTypes.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Catalog\Setup\Patch\Data;
use Magento\Catalog\Model\Product;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\Patch\DataPatchInterface;
class UpdateMultiselectAttributesBackendTypes implements DataPatchInterface
{
/**
* @var ModuleDataSetupInterface
*/
private $dataSetup;
/**
* @var EavSetupFactory
*/
private $eavSetupFactory;
/**
* MigrateMultiselectAttributesData constructor.
* @param ModuleDataSetupInterface $dataSetup
* @param EavSetupFactory $eavSetupFactory
*/
public function __construct(
ModuleDataSetupInterface $dataSetup,
EavSetupFactory $eavSetupFactory
) {
$this->dataSetup = $dataSetup;
$this->eavSetupFactory = $eavSetupFactory;
}
/**
* @inheritdoc
*/
public static function getDependencies()
{
return [];
}
/**
* @inheritdoc
*/
public function getAliases()
{
return [];
}
/**
* @inheritdoc
*/
public function apply()
{
$this->dataSetup->startSetup();
$connection = $this->dataSetup->getConnection();
$attributeTable = $connection->getTableName('eav_attribute');
/** @var EavSetup $eavSetup */
$eavSetup = $this->eavSetupFactory->create(['setup' => $this->dataSetup]);
$entityTypeId = $eavSetup->getEntityTypeId(Product::ENTITY);
$attributesToMigrate = $connection->fetchCol(
$connection
->select()
->from($attributeTable, ['attribute_id'])
->where('entity_type_id = ?', $entityTypeId)
->where('backend_type = ?', 'varchar')
->where('frontend_input = ?', 'multiselect')
);
$varcharTable = $connection->getTableName('catalog_product_entity_varchar');
$textTable = $connection->getTableName('catalog_product_entity_text');
$varcharTableDataSql = $connection
->select()
->from($varcharTable)
->where('attribute_id in (?)', $attributesToMigrate);
$dataToMigrate = array_map(static function ($row) {
$row['value_id'] = null;
return $row;
}, $connection->fetchAll($varcharTableDataSql));
foreach (array_chunk($dataToMigrate, 2000) as $dataChunk) {
$connection->insertMultiple($textTable, $dataChunk);
}
$connection->query($connection->deleteFromSelect($varcharTableDataSql, $varcharTable));
foreach ($attributesToMigrate as $attributeId) {
$eavSetup->updateAttribute($entityTypeId, $attributeId, 'backend_type', 'text');
}
$this->dataSetup->endSetup();
return $this;
}
}