Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

管理ツールの受注詳細ページで商品追加時に商品コードを入れるとエラーになる #4678

Closed
yoshiaki-natsume opened this issue Aug 31, 2020 · 5 comments
Milestone

Comments

@yoshiaki-natsume
Copy link
Contributor

yoshiaki-natsume commented Aug 31, 2020

概要(Overview)

管理ツールの受注詳細ページで商品追加時に商品コードを入れると
search product failed.
というアラートが出てきて商品の追加が出来ません

期待する内容(Expect) or 要望 (Requirement)

商品コードを入力した場合も正常に追加対象の商品が登録できるようになる

再現手順(Procedure)

管理ツールより
受注一覧→受注データを選択→商品を追加→検索boxに存在する商品コードを入力して検索すると
search product failed.
というアラートが出てくる

環境 (environment)

  • EC-CUBE: 4.0.0
  • PHP: 7.2.9
  • DB:
    • MySQL 5.7.x

関連情報 (Ref)

@okazy
Copy link
Contributor

okazy commented Aug 31, 2020

@yoshiaki-natsume

以下の環境でテストをして見ましたが再現しませんでした。

  • EC-CUBE: 4.0.5-rc
  • PHP: 7.4
  • DB:
    • MySQL 5.7

問題の箇所は以下の画像の箇所であっていますか?

image

@okazy okazy added this to the 4.0.x milestone Aug 31, 2020
@yoshiaki-natsume
Copy link
Contributor Author

yoshiaki-natsume commented Sep 1, 2020

すいません、問題の箇所はあっていますが前提条件で商品規格の用意に条件がありました。

  1. 商品規格の「規格1」のみ設定された商品があり、かつ商品規格に異なる商品コードが設定されている。
    (例:商品コード=AAA111, AAA123, AAA999) [1]
  2. 受注データ編集画面の「商品を追加」で上記の商品規格の中の一部の商品コードと部分一致する検索文字列を入力して検索する。
    (例: 検索文字列=AAA9) [2]
    (例: 検索文字列=AAA1) [3]
    なお、全ての商品規格の商品コードと部分一致する場合はエラーにならない。
    (例:検索文字列=AAA)[4]

[1]
product_class
[2]
fail1
[3]
fail2
[4]
success

@izayoi256
Copy link
Contributor

4.0.4にて再現しました。 refs

@okazy
Doctrineの動作を詳細に追った訳ではありませんが、商品規格に関する条件をEXISTSで指定する必要がありそうです。

if (isset($searchData['id']) && StringUtil::isNotBlank($searchData['id'])) {
$id = preg_match('/^\d{0,10}$/', $searchData['id']) ? $searchData['id'] : null;
if ($id && $id > '2147483647' && $this->isPostgreSQL()) {
$id = null;
}
$qb
->andWhere('p.id = :id OR p.name LIKE :likeid OR pc.code LIKE :likeid')
->setParameter('id', $id)
->setParameter('likeid', '%'.str_replace(['%', '_'], ['\\%', '\\_'], $searchData['id']).'%');
}

// 正常に動作したコード
        if (isset($searchData['id']) && StringUtil::isNotBlank($searchData['id'])) {
            $id = preg_match('/^\d{0,10}$/', $searchData['id']) ? $searchData['id'] : null;
            $expr = $qb->expr();
            $orX = $expr->orX();
            $subQuery = $this->getEntityManager()->createQueryBuilder();
            $subQuery
                ->select('pc2')
                ->from(ProductClass::class, 'pc2')
                ->andWhere('p.id = pc2.Product')
                ->andWhere('pc2.code LIKE :likeid');
            $orX->add('p.id = :id');
            $orX->add('p.name LIKE :likeid');
            $orX->add($expr->exists($subQuery));
            $qb
                ->andWhere($orX)
                ->setParameter('id', $id)
                ->setParameter('likeid', '%'.str_replace(['%', '_'], ['\\%', '\\_'], $searchData['id']).'%');
        }

@izayoi256
Copy link
Contributor

izayoi256 commented Sep 16, 2020

解決策は見当もつかないのですが、原因となる箇所はおよそ把握できたので報告します。

->addSelect('pc', 'pi', 'tr', 'ps')

上記にて商品規格(pc)がSELECTに追加されていて、コミットログを見るとこれはN+1問題への対応のようです。
この状態でWHERE pc.code = 'hoge'と指定して検索すると、結果のProduct::$ProductClassesには、商品コードがhogeの商品規格のみがセットされます。

$qb->addSelect(['pc', 'cc1', 'cc2', 'pi', 'pt'])

その後、上記にて再度商品規格(pc)をSELECTに追加して検索することで、商品コードがhoge以外の商品規格を検索する際に、DoctrineのObjectHydratorがうまく値を取れずエラーが発生する…みたいです。

単純にエラーが発生しないようにするだけなら、下記のいずれかの方法で対応が可能です。

  • ProductRepository::findWithSortedClassCategories()内の->addSelect(...)を削除する。
  • ProductRepository::getQueryBuilderBySearchDataForAdmin()内の->addSelect(...)を削除する。
  • ProductRepository::getQueryBuilderBySearchDataForAdmin()内の商品規格に関する条件をEXISTS句に変更する。

ちなみに商品管理画面で商品コードを指定して検索すると、

この状態でWHERE pc.code = 'hoge'と指定して検索すると、結果のProduct::$ProductClassesには、商品コードがhogeの商品規格のみがセットされます。

この現象が確認できたので併せて画像にて報告しておきます。(上はaddSelectあり、下はaddSelectなし)

addSelectあり
addSelectなし

okazy added a commit to okazy/ec-cube that referenced this issue Oct 12, 2020
izayoi256 added a commit to izayoi256/ec-cube that referenced this issue Oct 12, 2020
@okazy
Copy link
Contributor

okazy commented Oct 20, 2020

#4695 で修正されましたのでクローズします。
ご報告、調査、ご意見ありがとうございました。

@okazy okazy closed this as completed Oct 20, 2020
@okazy okazy modified the milestones: 4.0.x, 4.0.6 Oct 20, 2020
@chihiro-adachi chihiro-adachi modified the milestones: 4.0.6, 4.1 Jul 12, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants