isJoinSections = false; $this->isJoinProductCategories = false; $this->isJoinProductFamilySectionProperties = false; $this->isJoinProducts = false; $this->isJoinQualityLabels = false; } public function joinProductFamilySectionProperties(bool $addSelect = true): self { if (!$this->isJoinProductFamilySectionProperties) { $this->isJoinProductFamilySectionProperties = true; $this->leftJoin('.productFamilySectionProperties', 'productFamilySectionProperties'); if ($addSelect) { //NB : Ici le select est en commentaire car si il est actif doctrine n'hydrate pas correectement ProductFamilySectionProperties (si filtre sur section les ProductFamilySectionProperties des autres sections ne sont pas chargé et ça peut être problématique pr la gestion des stocks) //$this->addSelect('productFamilySectionProperties'); } } return $this; } public function joinQualityLabels(bool $addSelect = true): self { if (!$this->isJoinQualityLabels) { $this->isJoinQualityLabels = true; $this->leftJoin('.qualityLabels', 'qualityLabels'); if ($addSelect) { //$this->addSelect('qualityLabels'); } } return $this; } public function joinSections(bool $addSelect = true): self { if (!$this->isJoinSections) { $this->isJoinSections = true; $this->leftJoin('productFamilySectionProperties.section', 'section'); if ($addSelect) { $this->addSelect('section'); } } return $this; } public function filterBySection(SectionInterface $section, bool $addSelectProductFamilySectionProperties = true) { $this->joinProductFamilySectionProperties($addSelectProductFamilySectionProperties); $this->andWhereSection('productFamilySectionProperties', $section); $this->andWhere('productFamilySectionProperties.status = 1'); } public function filterByMerchantViaSection(MerchantInterface $merchant) { $this->joinProductFamilySectionProperties(false); $this->joinSections(false); $this->andWhereMerchant('section', $merchant); //$this->andWhere('productFamilySectionProperties.status = 1'); } public function selectCount(): self { return $this->select('count(productFamily.id)'); } public function selectProductCategories(): self { $this->joinProductCategories(); return $this->addSelect('pCategories'); } public function filterLikeBehaviorStockCycle(string $behaviorStockCycle): self { return $this ->andWhere('.behaviorStockCycle LIKE :behaviorStockCycle') ->setParameter('behaviorStockCycle', $behaviorStockCycle); } public function filterByProductCategory(ProductCategoryInterface $category): self { $this->joinProductCategories(); return $this ->andWhere(':category MEMBER OF .productCategories') ->setParameter('category', $category->getId()); } public function filterByProductCategoryArray(array $categoryArray): self { $this->joinProductCategories(); return $this ->andWhere(':categoryArray MEMBER OF .productCategories') ->setParameter('categoryArray', $categoryArray); } public function filterByPropertyNoveltyExpirationDate($dateTime = null): self { if (is_null($dateTime)) { $dateTime = new \DateTime(); } return $this->andWhere(':now <= .propertyNoveltyExpirationDate') ->setParameter('now', $dateTime); } public function filterIsOrganicLabel(): self { return $this->innerJoin('.qualityLabels', 'qualityLabel') ->andWhere('qualityLabel.devAlias IN (:organicLabels)') ->setParameter(':organicLabels', ProductFamilyModel::$organicLabels); } public function filterIsNovelty() { return $this->andWhere(':now <= .propertyNoveltyExpirationDate') ->setParameter('now', new \DateTime()); } public function filterByTerms($terms): self { $this->andWhere('.title LIKE :terms OR productCategories.title LIKE :terms'); $this->setParameter(':terms', '%' . $terms . '%'); return $this; } public function filterBySupplier($supplier): self { return $this->andWhereEqual('supplier', $supplier); } public function joinProductCategories(bool $addSelect = true): self { if (!$this->isJoinProductCategories) { $this->isJoinProductCategories = true; $this->leftJoin('.productCategories', 'productCategories'); if ($addSelect) { //Commenté sinon doctrine n'hydrate pas correctement les catégories liés au ProductFamily (exemple : un seul sur trois) //$this->addSelect('productCategories'); } return $this; } return $this; } public function selectProducts(): self { return $this->joinProducts(true); } public function joinProducts(bool $addSelect = true): self { if (!$this->isJoinProducts) { $this->isJoinProducts = true; $this->innerJoin('.products', 'products'); if ($addSelect) { // Décommenté sinon doctrine n'hydrate pas correctement les produits liés au ProductFamily (exemple : un seul sur deux) // $this->addSelect('products'); } } return $this; } public function orderByPosition(): self { $this->orderBy('e.position', 'ASC'); return $this; } }