質問 > フロント機能 > $query->getResultとSQLの実行結果が違う |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
uedymd |
投稿日時: 2020/3/11 16:26
対応状況: −−−
|
新米 ![]() ![]() 登録日: 2017/2/13 居住地: 投稿: 6 |
$query->getResultとSQLの実行結果が違う ▼テンプレート
[EC-CUBE] 4.0.3 新規インストール [レンタルサーバ] さくらサーバー [OS] FreeBSD 9.1-RELEASE-p24 amd64 [PHP] 7.3.14 [データベース] MySQL 5.7 [WEBサーバ] Apache/2.4.41 [ブラウザ] safari バージョン13.0.5 (15608.5.11) [導入プラグインの有無] 色々入れています [カスタマイズの有無] [現象] https://techmemo.biz/ec-cube/newitem-categoryitem-block/ こちらのサイトを参考にして、トップページにカテゴリ別の新着情報を表示する設定をしています。 $query = $qb->setMaxResults(10)->getQuery(); で、カテゴリごとに10件ごと新着商品を表示しようとしていますが、実際には4件や5件とかなり少ない商品しか表示されません。 $products = $query->getResult(); で取得した値を見てみても、やはり10件ありません。 デバッグモードで実行されたSQL文を確認し、DB上で実行すると、正しく10件表示されます。 何か書き方など問題があるのでしょうか。 以下、ソースになります。 public function getCustomizeNewProduct(int $cat_id) { try { //検索条件の新着順を定義 $searchData = array(); $qb = $this->entityManager->createQueryBuilder(); $query = $qb->select("plob") ->from("Eccube\\Entity\\Master\\ProductListOrderBy", "plob") ->where('plob.id = :id') ->setParameter('id', $this->eccubeConfig['eccube_product_order_newer']) ->getQuery(); $searchData['orderby'] = $query->getOneOrNullResult(); //カテゴリの指定 $qb = $this->entityManager->createQueryBuilder(); $query = $qb->select("ctg") ->from("Eccube\\Entity\\Category", "ctg") ->where('ctg.id = :id') ->setParameter('id', $cat_id) ->getQuery(); $searchData['category_id'] = $query->getOneOrNullResult(); //商品情報を10件取得 $qb = $this->productRepository->getQueryBuilderBySearchData($searchData); $query = $qb->setMaxResults(10)->getQuery(); $products = $query->getResult(); return $products; } catch (\Exception $e) { return null; } return null; } 【追記です】 実行されるSQLは以下になります。 SELECT d0_.id AS id_0, d0_.name AS name_1, d0_.note AS note_2, d0_.description_list AS description_list_3, d0_.description_detail AS description_detail_4, d0_.search_word AS search_word_5, d0_.free_area AS free_area_6, d0_.create_date AS create_date_7, d0_.update_date AS update_date_8, d0_.discriminator_type AS discriminator_type_9, d0_.creator_id AS creator_id_10, d0_.product_status_id AS product_status_id_11 FROM dtb_product d0_ INNER JOIN dtb_product_category d1_ ON d0_.id = d1_.product_id AND d1_.discriminator_type IN ('productcategory') INNER JOIN dtb_category d2_ ON d1_.category_id = d2_.id AND d2_.discriminator_type IN ('category') WHERE (d0_.product_status_id = 1 AND d1_.category_id IN (86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71)) AND d0_.discriminator_type IN ('product') ORDER BY d0_.create_date DESC, d0_.id DESC LIMIT 10 DB上で実行すると10件返ってきますが、Twigで取得できる値は4件となります。 |
468 |
投稿日時: 2020/3/12 9:25
対応状況: −−−
|
神 ![]() ![]() 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: $query->getResultとSQLの実行結果が違う SQLを実行した結果の10件は同じ商品が複数のカテゴリに紐づいて複数件出力されていないでしょうか?
getQueryBuilderBySearchDataはあくまでProductを返していると思います思いますので その辺りは自動的にまとめられているのではないでしょうか?
|
uedymd |
投稿日時: 2020/3/12 16:39
対応状況: −−−
|
新米 ![]() ![]() 登録日: 2017/2/13 居住地: 投稿: 6 |
Re: $query->getResultとSQLの実行結果が違う ご返信ありがとうございます!
ご指摘のとおり、同じ商品が複数件出力されていました。。。 //カテゴリの指定 $qb = $this->entityManager->createQueryBuilder(); $query = $qb->select("ctg") ->from("Eccube\\Entity\\Category", "ctg") ->where('ctg.id = :id') ->setParameter('id', $cat_id) ->getQuery(); $searchData['category_id'] = $query->getOneOrNullResult(); ここでカテゴリの指定方法が違っているということでしょうか? やりたいことは、カテゴリIDに紐づく新着商品10件を取得したいのですが。。。 確かにSQL文で d1_.category_id IN (86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71)と複数のカテゴリが指定されています。 |
468 |
投稿日時: 2020/3/16 10:31
対応状況: −−−
|
神 ![]() ![]() 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: $query->getResultとSQLの実行結果が違う function getQueryBuilderBySearchData()の
カテゴリによる絞込み条件をセットする処理を確認すると $Categories = $searchData['category_id']->getSelfAndDescendants(); でin句の内容をセットしている為、 関連する子カテゴリが含まれていると思います。 想定以上のカテゴリが対象となるのは それがカテゴリの親子関係が原因ではないでしょうか?
|
akt006 |
投稿日時: 2022/8/4 12:29
対応状況: −−−
|
新米 ![]() ![]() 登録日: 2022/8/4 居住地: 投稿: 1 |
Re: $query->getResultとSQLの実行結果が違う お世話になります。
私もこちらの対処方法について伺いたく返信させていただきます。 SQLで実行した際はsetMaxResultで指定した値の件数(複数のカテゴリに紐付いて複数件出力)が返ってくるのですが、Twigではまとめられ、出力される商品は少なくなってしまいます。 複数のカテゴリに紐付いた商品が含まれていたとしても、setMaxResultで指定した値と同じ件数の商品が返ってくるようにしたいです。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |