diff --git a/vendor/magento/module-related-product-graph-ql/Model/Resolver/Batch/AbstractLikedProducts.php b/vendor/magento/module-related-product-graph-ql/Model/Resolver/Batch/AbstractLikedProducts.php index f35af6f4885d2..9683c4f4524f0 100644 --- a/vendor/magento/module-related-product-graph-ql/Model/Resolver/Batch/AbstractLikedProducts.php +++ b/vendor/magento/module-related-product-graph-ql/Model/Resolver/Batch/AbstractLikedProducts.php @@ -1,21 +1,25 @@ productFieldsSelector = $productFieldsSelector; $this->relatedProductDataProvider = $relatedProductDataProvider; $this->productDataProvider = $productDataProvider; $this->searchCriteriaBuilder = $searchCriteriaBuilder; + $this->relatedProductsByStoreId = $relatedProductsByStoreId ?? + ObjectManager::getInstance()->get(RelatedProductsByStoreId::class); } /** @@ -77,19 +90,29 @@ abstract protected function getLinkType(): int; /** * Find related products. * - * @param \Magento\Catalog\Api\Data\ProductInterface[] $products + * @param ProductInterface[] $products * @param string[] $loadAttributes * @param int $linkType - * @return \Magento\Catalog\Api\Data\ProductInterface[][] + * @param string $websiteId + * @return ProductInterface[][] + * @throws LocalizedException */ - private function findRelations(array $products, array $loadAttributes, int $linkType): array - { + private function findRelations( + array $products, + array $loadAttributes, + int $linkType, + string $websiteId + ): array { //Loading relations $relations = $this->relatedProductDataProvider->getRelations($products, $linkType); if (!$relations) { return []; } - $relatedIds = array_unique(array_merge([], ...array_values($relations))); + //get related product ids by website id + $relatedIds = $this->relatedProductsByStoreId->execute( + array_unique(array_merge([], ...array_values($relations))), + $websiteId + ); //Loading products data. $this->searchCriteriaBuilder->addFilter('entity_id', $relatedIds, 'in'); $relatedSearchResult = $this->productDataProvider->getList( @@ -97,9 +120,9 @@ private function findRelations(array $products, array $loadAttributes, int $link $loadAttributes ); //Filling related products map. - /** @var \Magento\Catalog\Api\Data\ProductInterface[] $relatedProducts */ + /** @var ProductInterface[] $relatedProducts */ $relatedProducts = []; - /** @var \Magento\Catalog\Api\Data\ProductInterface $item */ + /** @var ProductInterface $item */ foreach ($relatedSearchResult->getItems() as $item) { $relatedProducts[$item->getId()] = $item; } @@ -127,10 +150,10 @@ function ($id) use ($relatedProducts) { */ public function resolve(ContextInterface $context, Field $field, array $requests): BatchResponse { - /** @var \Magento\Catalog\Api\Data\ProductInterface[] $products */ + /** @var ProductInterface[] $products */ $products = []; $fields = []; - /** @var \Magento\Framework\GraphQl\Query\Resolver\BatchRequestItemInterface $request */ + /** @var BatchRequestItemInterface $request */ foreach ($requests as $request) { //Gathering fields and relations to load. if (empty($request->getValue()['model'])) { @@ -141,14 +164,16 @@ public function resolve(ContextInterface $context, Field $field, array $requests } $fields = array_unique(array_merge([], ...$fields)); + $store = $context->getExtensionAttributes()->getStore(); + $websiteId = $store->getWebsiteId(); //Finding relations. - $related = $this->findRelations($products, $fields, $this->getLinkType()); + $related = $this->findRelations($products, $fields, $this->getLinkType(), (string) $websiteId); //Matching requests with responses. $response = new BatchResponse(); - /** @var \Magento\Framework\GraphQl\Query\Resolver\BatchRequestItemInterface $request */ + /** @var BatchRequestItemInterface $request */ foreach ($requests as $request) { - /** @var \Magento\Catalog\Api\Data\ProductInterface $product */ + /** @var ProductInterface $product */ $product = $request->getValue()['model']; $result = []; if (array_key_exists($product->getId(), $related)) { diff --git a/vendor/magento/module-related-product-graph-ql/Model/ResourceModel/RelatedProductsByStoreId.php b/vendor/magento/module-related-product-graph-ql/Model/ResourceModel/RelatedProductsByStoreId.php new file mode 100644 index 0000000000000..49b6beb8bc5b1 --- /dev/null +++ b/vendor/magento/module-related-product-graph-ql/Model/ResourceModel/RelatedProductsByStoreId.php @@ -0,0 +1,72 @@ +productLink = $productLink; + $this->connection = $resource->getConnection(); + } + + /** + * Get Product Models by storeId + * + * @param array $linkedProductIds + * @param string $websiteId + * @return array + * @throws LocalizedException + */ + public function execute(array $linkedProductIds, string $websiteId): array + { + $linkedStoreProductIds = []; + $mainTable = $this->productLink->getMainTable(); + $catalogProductWebsite = $this->productLink->getTable('catalog_product_website'); + if (!empty($linkedProductIds)) { + $select = $this->connection->select(); + $select->from( + ['main_table' => $mainTable], + ['linked_product_id'] + )->join( + ['product_website' => $catalogProductWebsite], + 'main_table.linked_product_id = product_website.product_id', + [] + )->where('product_website.website_id = ?', $websiteId) + ->where('main_table.linked_product_id IN (?)', $linkedProductIds); + $linkedStoreProductIds = $this->connection->fetchAll($select); + } + return !empty($linkedStoreProductIds) ? + array_column($linkedStoreProductIds, 'linked_product_id') + :[]; + } +}