<?php
/**
* Copyright(c) 2020 SYSTEM_KD
* Date: 2020/03/20
*/
namespace Plugin\CartUpRecommend\Repository;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\QueryBuilder;
use Eccube\Entity\Product;
use Eccube\Repository\AbstractRepository;
use Plugin\CartInRecommend\Entity\CartInRecommend;
use Plugin\CartUpRecommend\Entity\CartUpRecommend;
class CartUpRecommendRepository extends AbstractRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, CartUpRecommend::class);
}
/**
* @return QueryBuilder
*/
public function getTargetFindQueryBuilder(Product $product)
{
/** @var QueryBuilder $qb */
$qb = $this->createQueryBuilder('cur')
->join('cur.ProductClass', 'pc')
->join('pc.Product', 'p')
->andWhere('cur.ParentProduct = :product')
->setParameter('product', $product)
->andWhere('pc.visible = true')
->andWhere('p.Status = 1')
->orderBy('cur.sortNo', 'DESC');
return $qb;
}
/**
* @param CartUpRecommend $cartUpRecommend
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function save($cartUpRecommend)
{
if (!$cartUpRecommend->getId()) {
$sortNoTop = $this->findOneBy([], ['sortNo' => 'DESC']);
$sort_no = 0;
if (!is_null($sortNoTop)) {
$sort_no = $sortNoTop->getSortNo();
}
$cartUpRecommend->setSortNo($sort_no + 1);
}
$em = $this->getEntityManager();
$em->persist($cartUpRecommend);
$em->flush($cartUpRecommend);
}
/**
* @param Product $editProduct
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function optimize(Product $editProduct)
{
if (!$editProduct) return;
/** @var QueryBuilder $qb */
$qb = $this->createQueryBuilder('cr')
->join('cr.ParentProduct', 'p')
->join('cr.ProductClass', 'pc')
->andWhere('p.id = :product')
->setParameter('product', $editProduct)
->andWhere('pc.visible = false');
$cartUpRecommends = $qb->getQuery()->getResult();
/** @var CartInRecommend $cartUpRecommend */
foreach ($cartUpRecommends as $cartUpRecommend) {
// 削除してソート順調整
$sortNo = $cartUpRecommend->getSortNo();
$this->getEntityManager()->remove($cartUpRecommend);
$this->createQueryBuilder('cr')
->update()
->set('cr.sortNo', 'cr.sortNo -1')
->where('cr.sortNo > :sortNo')
->andWhere('cr.ParentProduct = :product')
->setParameter('sortNo', $sortNo)
->setParameter('product', $editProduct)
->getQuery()
->execute();
$this->getEntityManager()->flush($cartUpRecommend);
}
}
}