<?php
declare(strict_types=1);
namespace Slivki\Repository\Offer;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Slivki\Entity\FoodOfferExtension;
use Slivki\Exception\FoodOfferExtensionNotFoundException;
final class FoodOfferExtensionRepository extends ServiceEntityRepository implements FoodOfferExtensionRepositoryInterface
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, FoodOfferExtension::class);
}
public function findById(int $id): ?FoodOfferExtension
{
$queryBuilder = $this->createQueryBuilder('foe');
$expr = $queryBuilder->expr();
return $queryBuilder
->andWhere($expr->eq('foe.ID', ':id'))
->setParameter('id', $id)
->getQuery()
->getOneOrNullResult();
}
public function getById(int $id): FoodOfferExtension
{
$foodOfferExtension = $this->findById($id);
if (!$foodOfferExtension instanceof FoodOfferExtension) {
throw new FoodOfferExtensionNotFoundException();
}
return $foodOfferExtension;
}
public function findActiveByOfferIdAndShippingType(int $offerId, int $shippingType): array
{
$queryBuilder = $this->createQueryBuilder('foe');
$expr = $queryBuilder->expr();
$queryBuilder
->andWhere($expr->eq('foe.offer', ':offerId'))
->andWhere($expr->eq('foe.active', ':isActive'))
->setParameter('offerId', $offerId)
->setParameter('isActive', true);
if (FoodOfferExtension::DELIVERY_METHOD === $shippingType) {
$queryBuilder->andWhere($expr->eq('foe.isDelivery', ':isDelivery'))
->setParameter('isDelivery', true);
}
if (FoodOfferExtension::DELIVERY_METHOD_PICKUP === $shippingType) {
$queryBuilder->andWhere($expr->eq('foe.isPickup', ':isPickup'))
->setParameter('isPickup', true);
}
return $queryBuilder
->getQuery()
->getResult();
}
public function findAllActiveByOfferId(int $offerId): array
{
$queryBuilder = $this->createQueryBuilder('foe');
$expr = $queryBuilder->expr();
return $queryBuilder
->andWhere($expr->eq('foe.offer', ':offerId'))
->andWhere($expr->eq('foe.active', ':isActive'))
->setParameter('offerId', $offerId)
->setParameter('isActive', true)
->getQuery()
->getResult();
}
}