resourceConnection = $resourceConnection; $this->skuListInStockFactory = $skuListInStockFactory; $this->groupConcatMaxLen = $groupConcatMaxLen; } /** * Returns all assigned Stock ids by given Source Item ids * * @param int[] $sourceItemIds * @return SkuListInStock[] List of stock id to sku1,sku2 assignment */ public function execute(array $sourceItemIds): array { $connection = $this->resourceConnection->getConnection(); $sourceStockLinkTable = $this->resourceConnection->getTableName( StockSourceLinkResourceModel::TABLE_NAME_STOCK_SOURCE_LINK ); $sourceItemTable = $this->resourceConnection->getTableName( SourceItemResourceModel::TABLE_NAME_SOURCE_ITEM ); $select = $connection ->select() ->from( ['source_item' => $sourceItemTable], [ SourceItemInterface::SKU => sprintf("GROUP_CONCAT(DISTINCT %s SEPARATOR ',')", 'source_item.' . SourceItemInterface::SKU) ] )->joinInner( ['stock_source_link' => $sourceStockLinkTable], sprintf( 'source_item.%s = stock_source_link.%s', SourceItemInterface::SOURCE_CODE, StockSourceLink::SOURCE_CODE ), [StockSourceLink::STOCK_ID] )->where('source_item.source_item_id IN (?)', $sourceItemIds) ->group(['stock_source_link.' . StockSourceLink::STOCK_ID]); $connection->query('SET group_concat_max_len = ' . $this->groupConcatMaxLen); $items = $connection->fetchAll($select); return $this->getStockIdToSkuList($items); } /** * Return the assigned stock id to sku list * * @param array $items * @return SkuListInStock[] */ private function getStockIdToSkuList(array $items): array { $skuListInStockList = []; foreach ($items as $item) { /** @var SkuListInStock $skuListInStock */ $skuListInStock = $this->skuListInStockFactory->create(); $skuListInStock->setStockId((int)$item[StockSourceLink::STOCK_ID]); $skuListInStock->setSkuList(explode(',', $item[SourceItemInterface::SKU])); $skuListInStockList[] = $skuListInStock; } return $skuListInStockList; } }