isJoinProductFamilySectionProperties) { $this->isJoinProductFamilySectionProperties = true; $this->leftJoin('.productFamilySectionProperties', 'productFamilySectionProperties'); if ($addSelect) { $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->andWhere('.propertyOrganicLabel IS NOT NULL'); } 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 = false): self { if (!$this->isJoinProductCategories) { $this->isJoinProductCategories = true; $this->leftJoin('.productCategories', 'productCategories'); if ($addSelect) { $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) { $this->addSelect('products'); } } return $this; } public function orderByPosition(): self { $this->orderBy('e.position', 'ASC'); return $this; } }