Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SaveMultiple.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
13 
19 {
23  private $resourceConnection;
24 
28  public function __construct(
29  ResourceConnection $resourceConnection
30  ) {
31  $this->resourceConnection = $resourceConnection;
32  }
33 
40  public function execute(array $sourceItems)
41  {
42  if (!count($sourceItems)) {
43  return;
44  }
45  $connection = $this->resourceConnection->getConnection();
46  $tableName = $this->resourceConnection->getTableName(SourceItemResourceModel::TABLE_NAME_SOURCE_ITEM);
47 
48  $columnsSql = $this->buildColumnsSqlPart([
53  ]);
54  $valuesSql = $this->buildValuesSqlPart($sourceItems);
55  $onDuplicateSql = $this->buildOnDuplicateSqlPart([
58  ]);
59  $bind = $this->getSqlBindData($sourceItems);
60 
61  $insertSql = sprintf(
62  'INSERT INTO %s (%s) VALUES %s %s',
63  $tableName,
64  $columnsSql,
65  $valuesSql,
66  $onDuplicateSql
67  );
68  $connection->query($insertSql, $bind);
69  }
70 
75  private function buildColumnsSqlPart(array $columns): string
76  {
77  $connection = $this->resourceConnection->getConnection();
78  $processedColumns = array_map([$connection, 'quoteIdentifier'], $columns);
79  $sql = implode(', ', $processedColumns);
80  return $sql;
81  }
82 
87  private function buildValuesSqlPart(array $sourceItems): string
88  {
89  $sql = rtrim(str_repeat('(?, ?, ?, ?), ', count($sourceItems)), ', ');
90  return $sql;
91  }
92 
97  private function getSqlBindData(array $sourceItems): array
98  {
99  $bind = [];
100  foreach ($sourceItems as $sourceItem) {
101  $bind = array_merge($bind, [
102  $sourceItem->getSourceCode(),
103  $sourceItem->getSku(),
104  $sourceItem->getQuantity(),
105  $sourceItem->getStatus(),
106  ]);
107  }
108  return $bind;
109  }
110 
115  private function buildOnDuplicateSqlPart(array $fields): string
116  {
117  $connection = $this->resourceConnection->getConnection();
118  $processedFields = [];
119  foreach ($fields as $field) {
120  $processedFields[] = sprintf('%1$s = VALUES(%1$s)', $connection->quoteIdentifier($field));
121  }
122  $sql = 'ON DUPLICATE KEY UPDATE ' . implode(', ', $processedFields);
123  return $sql;
124  }
125 }
$tableName
Definition: trigger.php:13
$fields
Definition: details.phtml:14
$columns
Definition: default.phtml:15
__construct(ResourceConnection $resourceConnection)
$sourceItems
$connection
Definition: bulk.php:13