バージョン選択

フォーラム

メニュー

オンライン状況

51 人のユーザが現在オンラインです。 (39 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 50
tattsu もっと...

サイト内検索

質問 > その他 > エンティティでのリポジトリの呼び出し方

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
tori3103
投稿日時: 2019/12/8 23:25
対応状況: −−−
新米
登録日: 2019/12/8
居住地:
投稿: 8
エンティティでのリポジトリの呼び出し方
[EC-CUBE] 4.03

EC-CUBEもSymphonyも初心者なため,的外れな質問かもしれないのですが…。
あるエンティティから別のエンティティのリポジトリを呼び出すにはどのようにすればいいのでしょうか?
例えば,OrderItemエンティティでProductClassのリポジトリを使用したいような場合です。

2系から4系へデータを移行したのですがProductClassが物理削除されている注文明細があり,いくつかの場面でエラーが発生します。
OrderItemがProductClass関連を取得しようとする場合,ProductClassIDの存在確認した上で,存在しない場合はエラー回避できるようにカスタマイズしたいのですが,そもそもレコードが存在するかどうかの判断をどうすればいいのかがよくわかりません。
SQLを直接書いてしまえれば…と思うのですが,それすらどこに書いてどう呼び出せばいいのか???なので…。


468
投稿日時: 2019/12/11 9:45
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: エンティティでのリポジトリの呼び出し方
個人的な感覚ですが、
エンティティクラス内でリポジトリを呼び出す事は出来ないのではないでしょうか?
またリポジトリを呼び出せたとしても、問題の解決に繋がらないのではないかと思います。

今回、ご質問されている件ですが
経験上、一発でエラーを解決するのは難しいのではないかと思います。
理由としては、ECCUBEがリレーション先が物理削除されている場合でも正常に動作するようには作られていないからです。
(ECCUBEに限らずリレーション先のレコードが存在していない場合は異常な状態ではないかと思いますが...)
具体的にどこでエラーが発生しているか分からない為、予想でしかありませんが、
例えば、twig上で{{ OrderItem->ProductClass->product_code }}のようにProductClassエンティティのメンバへのアクセスを
メソッドチェーンで記述されているような箇所があった場合、
メソッドチェーンを分解してtwigにnull判定を書き加える以外、回避する手段が無いように思います。

1つ1つエラーが発生する箇所を修正していく事になるのではないでしょうか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

tori3103
投稿日時: 2019/12/11 11:15
対応状況: −−−
新米
登録日: 2019/12/8
居住地:
投稿: 8
Re: エンティティでのリポジトリの呼び出し方
ご回答ありがとうございます。

やはりそうですよね…。
ひとつずつあたっていくしかないですね。


ただ,OrderItemが存在しないproducut_class_idを持っていた場合,twig上で{{ OrderItem->ProductClass->product_code }}とあるとすると,OrderItem->ProductClassはnullにならないようなのです。
その先のチェーンでエラーになっているみたいで,ProductClass自体がnullになるようにしたかったのですが…。
あるいは,twig上でproducut_class_idが存在していないというのを判定する方法はありますでしょうか?

ECCUBEは初めて触るので何が何だか…で,的外れでしたらすみません…。
468
投稿日時: 2019/12/11 17:08
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: エンティティでのリポジトリの呼び出し方
エラーメッセージが分からないので何とも言えないのですが
このような状況でよくあるエラーとして
Call to a member function ****** on null
ではないかと思いますが、そのようなエラーはログに出ていませんか?

私の予想では結果がnullにならないのではなく、
OrderItem->ProductClassでnullが返ってきており、
null->product_code の結果、nullにはproduct_codeというメンバがありません。というエラーが起きているのではないかと思います。

{% if OrderItem->ProductClass %}
    {{ OrderItem->ProductClass->product_code }}
{% endif %}

こういったif文を追加する事で判定する事は出来ると思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

tori3103
投稿日時: 2019/12/11 23:53
対応状況: −−−
新米
登録日: 2019/12/8
居住地:
投稿: 8
Re: エンティティでのリポジトリの呼び出し方
エラーメッセージは,
Entity of type 'Eccube\Entity\ProductClass' for IDs id(***) was not found
です。

例えば,フロント側のマイページから注文詳細を表示させようとした場合などです。
このテンプレートの\Mypage\history.twigですが,


{% if orderItem.ProductClass is not null %}
 {% if orderItem.ProductClass.ClassCategory1 is not null %}
 {{ orderItem.productClass.classCategory1.className.name  }}:{{ orderItem.productClass.classCategory1 }}
 {% endif %}
…

エラーでひっかかるのは「orderItem.ProductClass.ClassCategory1」の行番号が出ており,なぜその上でnullの判定にならないのか?なのです…。
(実際{% if orderItem.ProductClass is not null %}のif文の間に別の文字列を入れてみるとエラーにならず表示されます。)


商品規格のリレーションが切れているのが異常な状態なのはその通りなのですが,2系の時のデータベースのデータを再確認してもデータは同じなので移行時に漏れたということもないようで,2系の時にどういう運用をしていたのかもわからないため,なぜ商品規格が物理削除されているのかも分からない状態です。
最低限フロント側にエラーを出したくないので,強制的に新規に商品規格を追加してしまおうかと考えているところです…。
umebius
投稿日時: 2019/12/12 8:19
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: エンティティでのリポジトリの呼び出し方
2系から3系、4系に移行する際はこのケースをよくお見かけします。

2系では外部キー制約がなかったため、データベース上直接レコード削除が可能で大概動作もしていましたが、基本的に3系、4系ではエラーになります。

実際に対応したProductClassのデータを投入する以外ですと、考えられそうな対応策としては下記のあたりになります。

マイページだけだとこれでいけると思いますが、受注管理なども考えると、他にも色々必要かもしれません。

1.product_class_idが物理削除されていれば
dtb_order_itemテーブルのproduct_class_idをNULLにする。

2.データがおかしくないかのチェックを入れる
OrderItemエンティティに、EntityUtil::isEmptyでレコードが存在するかのチェックを入れるなど。

※EntityUtil::isEmptyは4系では非推奨メソッドとなっています。

/**
         * Get productClass.
         *
         * @return \Eccube\Entity\ProductClass|null
         */
        public function getProductClass()
        {
            if (\Eccube\Util\EntityUtil::isEmpty($this->ProductClass)) {
                return null;
            }
            return $this->ProductClass;
        }


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

tori3103
投稿日時: 2019/12/12 18:28
対応状況: 解決済
新米
登録日: 2019/12/8
居住地:
投稿: 8
Re: エンティティでのリポジトリの呼び出し方
ご回答ありがとうございます。

管理側でもいくつかエラーが出ているので,受注明細が持っているProductClassのIDでレコードを新規登録することにしました。

他にもリレーションが切れている場合がありそうなので,EntityUtil::isEmptyは検査等で使えそうです。
ありがとうございました!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,280名です
総投稿数は109,687件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.