<?php namespace Lc\ShopBundle\Repository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\QueryBuilder; use Lc\ShopBundle\Context\FilterMerchantInterface; use Lc\ShopBundle\Context\FilterMultipleMerchantsInterface; use Lc\ShopBundle\Context\MerchantUtilsInterface; use Lc\ShopBundle\Context\StatusInterface; class BaseRepository extends EntityRepository implements ServiceEntityRepositoryInterface { public $merchantUtils; /** * @param string $entityClass The class name of the entity this repository manages */ public function __construct(EntityManager $entityManager, MerchantUtilsInterface $merchantUtils) { $this->merchantUtils = $merchantUtils; parent::__construct($entityManager, $entityManager->getClassMetadata($this->getInterfaceClass())); } public function findByTerm($field, $term, $limit=10){ $qb = $this->findByMerchantQuery(); $qb->select('e.'.$field); $qb->andWhere( $qb->expr()->like('e.'.$field, ':term')); $qb->setParameter('term', '%'.$term.'%'); $qb->setMaxResults($limit); return $qb->getQuery()->getResult(); } public function findByMerchantQuery() :QueryBuilder { return $this->createQueryBuilder('e') ->where('e.merchant = :currentMerchant') ->setParameter('currentMerchant', $this->merchantUtils->getMerchantCurrent()->getId()) ; } public function findAll() { return $this->findBy(array()); } public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) { $className = $this->getClassMetadata()->getName(); $entity = new $className; if($entity instanceof StatusInterface){ if (!isset($criteria['status'])) $criteria['status'] = 1; if ($criteria['status'] === false) unset($criteria['status']); } if($entity instanceof FilterMerchantInterface){ if (!isset($criteria['merchant'])) $criteria['merchant'] = $this->merchantUtils->getMerchantCurrent(); if ($criteria['merchant'] === false) unset($criteria['merchant']); } return parent::findBy($criteria, $orderBy, $limit, $offset); } public function findOneBy(array $criteria, array $orderBy = null) { $className = $this->getClassMetadata()->getName(); $entity = new $className; if($entity instanceof StatusInterface){ if (!isset($criteria['status'])) $criteria['status'] = 1; if ($criteria['status'] === false) unset($criteria['status']); } if($entity instanceof FilterMerchantInterface){ if (!isset($criteria['merchant'])) $criteria['merchant'] = $this->merchantUtils->getMerchantCurrent(); if ($criteria['merchant'] === false) unset($criteria['merchant']); } return parent::findOneBy($criteria, $orderBy); } }