Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
3 / 3 |
CRAP | |
100.00% |
55 / 55 |
| ProductRepository | |
100.00% |
1 / 1 |
|
100.00% |
4 / 4 |
34 | |
100.00% |
55 / 55 |
| get | |
100.00% |
1 / 1 |
2 | |
100.00% |
7 / 7 |
|||
| getQueryBuilderBySearchData | |
100.00% |
1 / 1 |
12 | |
100.00% |
29 / 29 |
|||
| getQueryBuilderBySearchDataForAdmin | |
100.00% |
1 / 1 |
19 | |
100.00% |
19 / 19 |
|||
| getFavoriteProductQueryBuilderByCustomer | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
| <?php | |
| /* | |
| * This file is part of EC-CUBE | |
| * | |
| * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved. | |
| * | |
| * http://www.lockon.co.jp/ | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License | |
| * as published by the Free Software Foundation; either version 2 | |
| * of the License, or (at your option) any later version. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU General Public License | |
| * along with this program; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
| */ | |
| namespace Eccube\Repository; | |
| use Eccube\Util\Str; | |
| use Doctrine\ORM\EntityRepository; | |
| use Doctrine\ORM\NoResultException; | |
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | |
| /** | |
| * ProductRepository | |
| * | |
| * This class was generated by the Doctrine ORM. Add your own custom | |
| * repository methods below. | |
| */ | |
| class ProductRepository extends EntityRepository | |
| { | |
| /** | |
| * get Product. | |
| * | |
| * @param integer $productId | |
| * @return \Eccube\Entity\Product | |
| * | |
| * @throws NotFoundHttpException | |
| */ | |
| public function get($productId) | |
| { | |
| // Product | |
| try { | |
| $qb = $this->createQueryBuilder('p') | |
| ->andWhere('p.id = :id'); | |
| $product = $qb | |
| ->getQuery() | |
| ->setParameters(array( | |
| 'id' => $productId, | |
| )) | |
| ->getSingleResult(); | |
| } catch (NoResultException $e) { | |
| throw new NotFoundHttpException(); | |
| } | |
| return $product; | |
| } | |
| /** | |
| * get query builder. | |
| * | |
| * @param array $searchData | |
| * @return \Doctrine\ORM\QueryBuilder | |
| */ | |
| public function getQueryBuilderBySearchData($searchData) | |
| { | |
| $qb = $this->createQueryBuilder('p') | |
| ->andWhere('p.Status = 1'); | |
| // category | |
| $categoryJoin = false; | |
| if (!empty($searchData['category_id']) && $searchData['category_id']) { | |
| $Categories = $searchData['category_id']->getSelfAndDescendants(); | |
| if ($Categories) { | |
| $qb | |
| ->innerJoin('p.ProductCategories', 'pct') | |
| ->innerJoin('pct.Category', 'c') | |
| ->andWhere($qb->expr()->in('pct.Category', ':Categories')) | |
| ->setParameter('Categories', $Categories); | |
| $categoryJoin = true; | |
| } | |
| } | |
| // name | |
| if (isset($searchData['name']) && Str::isNotBlank($searchData['name'])) { | |
| $keywords = preg_split('/[\s ]+/u', $searchData['name'], -1, PREG_SPLIT_NO_EMPTY); | |
| foreach ($keywords as $index => $keyword) { | |
| $key = sprintf('keyword%s', $index); | |
| $qb | |
| ->andWhere(sprintf('p.name LIKE :%s OR p.search_word LIKE :%s', $key, $key)) | |
| ->setParameter($key, '%' . $keyword . '%'); | |
| } | |
| } | |
| // Order By | |
| // 価格順 | |
| if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == '1') { | |
| //@see http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html | |
| $qb->addSelect('MIN(pc.price02) as HIDDEN price02_min'); | |
| $qb->innerJoin('p.ProductClasses', 'pc'); | |
| $qb->groupBy('p'); | |
| // postgres9.0以下は, groupBy('p.id')が利用できない | |
| // mysqlおよびpostgresql9.1以上であればgroupBy('p.id')にすることで性能向上が期待できる. | |
| // @see https://github.com/EC-CUBE/ec-cube/issues/1904 | |
| // $qb->groupBy('p.id'); | |
| $qb->orderBy('price02_min', 'ASC'); | |
| $qb->addOrderBy('p.id', 'DESC'); | |
| // 新着順 | |
| } else if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == '2') { | |
| $qb->orderBy('p.create_date', 'DESC'); | |
| } else { | |
| if ($categoryJoin === false) { | |
| $qb | |
| ->leftJoin('p.ProductCategories', 'pct') | |
| ->leftJoin('pct.Category', 'c'); | |
| } | |
| $qb | |
| ->addOrderBy('p.id', 'DESC'); | |
| } | |
| return $qb; | |
| } | |
| /** | |
| * get query builder. | |
| * | |
| * @param array $searchData | |
| * @return \Doctrine\ORM\QueryBuilder | |
| */ | |
| public function getQueryBuilderBySearchDataForAdmin($searchData) | |
| { | |
| $qb = $this->createQueryBuilder('p') | |
| ->innerJoin('p.ProductClasses', 'pc'); | |
| // id | |
| if (isset($searchData['id']) && Str::isNotBlank($searchData['id'])) { | |
| $id = preg_match('/^\d+$/', $searchData['id']) ? $searchData['id'] : null; | |
| $qb | |
| ->andWhere('p.id = :id OR p.name LIKE :likeid OR pc.code LIKE :likeid') | |
| ->setParameter('id', $id) | |
| ->setParameter('likeid', '%' . $searchData['id'] . '%'); | |
| } | |
| // code | |
| /* | |
| if (!empty($searchData['code']) && $searchData['code']) { | |
| $qb | |
| ->innerJoin('p.ProductClasses', 'pc') | |
| ->andWhere('pc.code LIKE :code') | |
| ->setParameter('code', '%' . $searchData['code'] . '%'); | |
| } | |
| // name | |
| if (!empty($searchData['name']) && $searchData['name']) { | |
| $keywords = preg_split('/[\s ]+/u', $searchData['name'], -1, PREG_SPLIT_NO_EMPTY); | |
| foreach ($keywords as $keyword) { | |
| $qb | |
| ->andWhere('p.name LIKE :name') | |
| ->setParameter('name', '%' . $keyword . '%'); | |
| } | |
| } | |
| */ | |
| // category | |
| if (!empty($searchData['category_id']) && $searchData['category_id']) { | |
| $Categories = $searchData['category_id']->getSelfAndDescendants(); | |
| if ($Categories) { | |
| $qb | |
| ->innerJoin('p.ProductCategories', 'pct') | |
| ->innerJoin('pct.Category', 'c') | |
| ->andWhere($qb->expr()->in('pct.Category', ':Categories')) | |
| ->setParameter('Categories', $Categories); | |
| } | |
| } | |
| // status | |
| if (!empty($searchData['status']) && $searchData['status']->toArray()) { | |
| $qb | |
| ->andWhere($qb->expr()->in('p.Status', ':Status')) | |
| ->setParameter('Status', $searchData['status']->toArray()); | |
| } | |
| // link_status | |
| if (isset($searchData['link_status'])) { | |
| $qb | |
| ->andWhere($qb->expr()->in('p.Status', ':Status')) | |
| ->setParameter('Status', $searchData['link_status']); | |
| } | |
| // stock status | |
| if (isset($searchData['stock_status'])) { | |
| $qb | |
| ->andWhere('pc.stock_unlimited = :StockUnlimited AND pc.stock = 0') | |
| ->setParameter('StockUnlimited', $searchData['stock_status']); | |
| } | |
| // crate_date | |
| if (!empty($searchData['create_date_start']) && $searchData['create_date_start']) { | |
| $date = $searchData['create_date_start'] | |
| ->format('Y-m-d H:i:s'); | |
| $qb | |
| ->andWhere('p.create_date >= :create_date_start') | |
| ->setParameter('create_date_start', $date); | |
| } | |
| if (!empty($searchData['create_date_end']) && $searchData['create_date_end']) { | |
| $date = clone $searchData['create_date_end']; | |
| $date = $date | |
| ->modify('+1 days') | |
| ->format('Y-m-d H:i:s'); | |
| $qb | |
| ->andWhere('p.create_date < :create_date_end') | |
| ->setParameter('create_date_end', $date); | |
| } | |
| // update_date | |
| if (!empty($searchData['update_date_start']) && $searchData['update_date_start']) { | |
| $date = $searchData['update_date_start'] | |
| ->format('Y-m-d H:i:s'); | |
| $qb | |
| ->andWhere('p.update_date >= :update_date_start') | |
| ->setParameter('update_date_start', $date); | |
| } | |
| if (!empty($searchData['update_date_end']) && $searchData['update_date_end']) { | |
| $date = clone $searchData['update_date_end']; | |
| $date = $date | |
| ->modify('+1 days') | |
| ->format('Y-m-d H:i:s'); | |
| $qb | |
| ->andWhere('p.update_date < :update_date_end') | |
| ->setParameter('update_date_end', $date); | |
| } | |
| // Order By | |
| $qb | |
| ->orderBy('p.update_date', 'DESC'); | |
| return $qb; | |
| } | |
| /** | |
| * get query builder. | |
| * | |
| * @param $Customer | |
| * @return \Doctrine\ORM\QueryBuilder | |
| * @see CustomerFavoriteProductRepository::getQueryBuilderByCustomer() | |
| * @deprecated since 3.0.0, to be removed in 3.1 | |
| */ | |
| public function getFavoriteProductQueryBuilderByCustomer($Customer) | |
| { | |
| $qb = $this->createQueryBuilder('p') | |
| ->innerJoin('p.CustomerFavoriteProducts', 'cfp') | |
| ->where('cfp.Customer = :Customer AND p.Status = 1') | |
| ->setParameter('Customer', $Customer); | |
| // Order By | |
| // XXX Paginater を使用した場合に PostgreSQL で正しくソートできない | |
| $qb->addOrderBy('cfp.create_date', 'DESC'); | |
| return $qb; | |
| } | |
| } |