SaveMultiple.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\InventoryLowQuantityNotification\Model\ResourceModel\SourceItemConfiguration;
  8. use Magento\Framework\App\ResourceConnection;
  9. use Magento\InventoryLowQuantityNotificationApi\Api\Data\SourceItemConfigurationInterface;
  10. /**
  11. * Implementation of Source Item Configuration save multiple operation for specific db layer
  12. * Save Multiple used here for performance efficient purposes over single save operation
  13. */
  14. class SaveMultiple
  15. {
  16. /**
  17. * @var ResourceConnection
  18. */
  19. private $resourceConnection;
  20. /**
  21. * @param ResourceConnection $resourceConnection
  22. */
  23. public function __construct(
  24. ResourceConnection $resourceConnection
  25. ) {
  26. $this->resourceConnection = $resourceConnection;
  27. }
  28. /**
  29. * @param SourceItemConfigurationInterface[] $sourceItemConfigurations
  30. * @return void
  31. */
  32. public function execute(array $sourceItemConfigurations)
  33. {
  34. if (!count($sourceItemConfigurations)) {
  35. return;
  36. }
  37. $connection = $this->resourceConnection->getConnection();
  38. $tableName = $this->resourceConnection
  39. ->getTableName('inventory_low_stock_notification_configuration');
  40. $columnsSql = $this->buildColumnsSqlPart([
  41. SourceItemConfigurationInterface::SOURCE_CODE,
  42. SourceItemConfigurationInterface::SKU,
  43. SourceItemConfigurationInterface::INVENTORY_NOTIFY_QTY
  44. ]);
  45. $valuesSql = $this->buildValuesSqlPart($sourceItemConfigurations);
  46. $onDuplicateSql = $this->buildOnDuplicateSqlPart([
  47. SourceItemConfigurationInterface::INVENTORY_NOTIFY_QTY
  48. ]);
  49. $bind = $this->getSqlBindData($sourceItemConfigurations);
  50. $insertSql = sprintf(
  51. 'INSERT INTO %s (%s) VALUES %s %s',
  52. $tableName,
  53. $columnsSql,
  54. $valuesSql,
  55. $onDuplicateSql
  56. );
  57. $connection->query($insertSql, $bind);
  58. }
  59. /**
  60. * @param array $columns
  61. * @return string
  62. */
  63. private function buildColumnsSqlPart(array $columns): string
  64. {
  65. $connection = $this->resourceConnection->getConnection();
  66. $processedColumns = array_map([$connection, 'quoteIdentifier'], $columns);
  67. $sql = implode(', ', $processedColumns);
  68. return $sql;
  69. }
  70. /**
  71. * @param SourceItemConfigurationInterface[] $sourceItemConfigurations
  72. * @return string
  73. */
  74. private function buildValuesSqlPart(array $sourceItemConfigurations): string
  75. {
  76. $sql = rtrim(str_repeat('(?, ?, ?), ', count($sourceItemConfigurations)), ', ');
  77. return $sql;
  78. }
  79. /**
  80. * @param SourceItemConfigurationInterface[] $sourceItemConfigurations
  81. * @return array
  82. */
  83. private function getSqlBindData(array $sourceItemConfigurations): array
  84. {
  85. $bind = [];
  86. foreach ($sourceItemConfigurations as $sourceItemConfiguration) {
  87. $bind = array_merge($bind, [
  88. $sourceItemConfiguration->getSourceCode(),
  89. $sourceItemConfiguration->getSku(),
  90. $sourceItemConfiguration->getNotifyStockQty()
  91. ]);
  92. }
  93. return $bind;
  94. }
  95. /**
  96. * @param array $fields
  97. * @return string
  98. */
  99. private function buildOnDuplicateSqlPart(array $fields): string
  100. {
  101. $connection = $this->resourceConnection->getConnection();
  102. $processedFields = [];
  103. foreach ($fields as $field) {
  104. $processedFields[] = sprintf('%1$s = VALUES(%1$s)', $connection->quoteIdentifier($field));
  105. }
  106. $sql = 'ON DUPLICATE KEY UPDATE ' . implode(', ', $processedFields);
  107. return $sql;
  108. }
  109. }