<?php
namespace App\Repository;
use App\Entity\Order;
use App\Entity\OrderItem;
use Doctrine\ORM\EntityManagerInterface;
class OrderItemRepository extends GeneralRepository
{
private $definedAlias = [];
public function init()
{
parent::init();
$this->definedAlias = [];
}
public function __construct(EntityManagerInterface $em)
{
$classMetadata = $em->getClassMetadata(OrderItem::class);
parent::__construct($em, $classMetadata);
$this->setLetter('oi');
$this->setDefaultSort([
'field' => 'createdAt',
'order' => 'DESC'
]);
$this->setDefaultLimit(10);
}
public function setSearchParams($params)
{
parent::setSearchParams($params);
if (isset($params['product'])) {
$this->product($params['product']);
}
if (isset($params['productIn'])) {
$this->productIn($params['productIn']);
}
if (isset($params['before'])) {
$this->before($params['before']);
}
if (isset($params['after'])) {
$this->after($params['after']);
}
if (isset($params['visibleOrder'])) {
if ($params['visibleOrder']) {
$this->visibleOrderOnly();
}
}
if (isset($params['emptySavingOny'])) {
if ($params['emptySavingOny']) {
$this->emptySavingOnly();
}
}
if (isset($params['emptyByCustomerOccurence'])) {
if ($params['emptyByCustomerOccurence']) {
$this->emptyByCustomerOccurence();
}
}
if (isset($params['occurenceEqual'])) {
$this->occurenceEqual($params['occurenceEqual']);
}
if (isset($params['orderedBy'])) {
$this->orderedBy($params['orderedBy']);
}
}
private function occurenceEqual($occurence)
{
$this->qb
->andWhere($this->letter . '.boughtByCustomerOccurence = :occurence')
->setParameter(':occurence', $occurence);
}
private function orderedBy($customers)
{
$this->joinOrder();
$this->qb
->andWhere('o.customer IN (:customers)')
->setParameter(':customers', $customers);
}
private function joinOrder()
{
if (! in_array('o', $this->definedAlias)) {
$this->qb->leftJoin(Order::class, 'o', 'WITH', 'o.id = ' . $this->letter . '.order');
$this->definedAlias[] = 'o';
}
}
private function visibleOrderOnly()
{
$this->joinOrder();
$this->qb
->andWhere('o.visible = :visible')
->setParameter(':visible', true);
}
private function productIn($products)
{
$this->qb
->andWhere($this->letter . '.product IN (:products)')
->setParameter(':products', $products);
}
private function product($product)
{
$this->qb
->andWhere($this->letter . '.product = :product')
->setParameter(':product', $product);
}
private function before($dt)
{
$this->qb
->andWhere($this->letter . '.createdAt <= :before')
->setParameter(':before', $dt);
}
private function after($dt)
{
$this->qb
->andWhere($this->letter . '.createdAt >= :after')
->setParameter(':after', $dt);
}
private function emptySavingOnly()
{
$this->qb
->andWhere($this->letter . '.totalSavingExcludingTax IS NULL');
}
private function emptyByCustomerOccurence()
{
$this->qb
->andWhere($this->letter . '.boughtByCustomerOccurence IS NULL');
}
}