プラグイン > 開発について > 検索機能の拡張について |
開発について
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
Morpheus |
投稿日時: 2018/2/28 8:26
対応状況: −−−
|
新米 登録日: 2018/2/28 居住地: 投稿: 3 |
検索機能の拡張について ▼テンプレート
[EC-CUBE]3.0.15 [データベース]MySQL5.7 [現象] 掲題の通り、検索機能の拡張についてプラグインを作成しています。 価格帯での検索を追加しようと試みたところ下記のエラーが発生してしまいました。 [Semantical Error] line 0, col 452 near 'prc_min >= 2000': Error: Class Eccube\Entity\ProductClass has no field or association named prc_min エラーに続き出力されたクエリービルダの内容は下記の通りです。 SELECT p, MIN(pcp.price02) as prc_min , (case when pcs.stock_unlimited = false and pcs.stock = 0 then 1 else 0 end) as HIDDEN stock_is_no , MIN(pc.price02) as price02_min FROM Eccube\Entity\Product p INNER JOIN p.ProductClasses pcp INNER JOIN p.ProductCategories pct0 INNER JOIN pct0.Category c0 INNER JOIN p.ProductCategories pct3 INNER JOIN pct3.Category c3 INNER JOIN p.ProductClasses pcs INNER JOIN p.ProductClasses pc WHERE p.Status = 1 AND ((pcp.prc_min >= 2000 and pcp.prc_min < 5000)) AND pct0.Category IN(:Categories0) AND pct3.Category IN(:Categories3) AND (pcs.stock_unlimited = true OR pcs.stock > 0) GROUP BY p ORDER BY price02_min ASC, p.note ASC 価格帯以外にも条件が検索できるようになっており、価格帯の条件文を外すと正常に動作します。 なぜ価格帯について条件を付加するとこのようなエラーが発生するか分からず困っております。 もしお知恵をお貸しいただけたら幸いです。 何卒宜しくお願いします。 |
umebius |
投稿日時: 2018/2/28 8:35
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: 検索機能の拡張について 引用:
pcp.prc_min >= 2000 and pcp.prc_min < 5000 上のようにpcp.prc_minと記載されている箇所がございますが、 「pcp.prc_min」ではなく、ただの「prc_min」ですとどうなりますか?
|
Morpheus |
投稿日時: 2018/2/28 11:01
対応状況: −−−
|
新米 登録日: 2018/2/28 居住地: 投稿: 3 |
Re: 検索機能の拡張について 早速の返信ありがとうございます。
条件式から「pcp.」を削除すると ContextErrorException in SqlWalker.php line 2252: Notice: Undefined index: prc_min となり、これもまた動かないのです。 またこの際には、クエリビルダの状況は出力されません。 |
umebius |
投稿日時: 2018/2/28 11:09
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 投稿: 2085 |
Re: 検索機能の拡張について MIN(pcp.price02) as HIDDEN prc_min というように書かれているのでしょうか
クエリビルダの生成コードを拝見できますか?
|
Morpheus |
投稿日時: 2018/2/28 11:28
対応状況: −−−
|
新米 登録日: 2018/2/28 居住地: 投稿: 3 |
Re: 検索機能の拡張について ありがとうございます。
$qb = $this->createQueryBuilder('p')->andWhere('p.Status = 1'); // Price $qb->addSelect('MIN(pcp.price02) as prc_min '); $qb->innerJoin('p.ProductClasses', 'pcp'); $qb->groupBy('p'); $qb->andWhere( '(pcp.prc_min >= 2000 and pcp.prc_min < 5000)' ); // category $qb ->innerJoin('p.ProductCategories', 'pct0') ->innerJoin('pct0.Category', 'c0') ->andWhere($qb->expr()->in('pct0.Category', ':Categories0')) ->setParameter('Categories0', $searchData['checkbox0']); $qb ->innerJoin('p.ProductCategories', 'pct3') ->innerJoin('pct3.Category', 'c3') ->andWhere($qb->expr()->in('pct3.Category', ':Categories3')) ->setParameter('Categories3', $searchData['checkbox3']); // stock $qb->addSelect('(case when pcs.stock_unlimited = false and pcs.stock = 0 then 1 else 0 end) as HIDDEN stock_is_no '); $qb->innerJoin('p.ProductClasses', 'pcs'); $qb->groupBy('p'); $qb->andWhere('pcs.stock_unlimited = true OR pcs.stock > 0'); // 価格低い順 $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.note', 'DESC'); コードはこの上記のようになっています。 判定ロジックは取り除いております。 またこの価格に関わる部分を取り除く、もしくは条件から価格を外すと意図した通りの検索結果が表示されます。 ※ProductRepositoryを継承し「getQueryBuilderBySearchData」メソッドを元に作成したメソッドになります。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |