質問 > その他 > エンティティでのリポジトリの呼び出し方 |
その他
スレッド表示 | 古いものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
tori3103 |
投稿日時: 2019/12/12 18:28
対応状況: 解決済
|
新米 登録日: 2019/12/8 居住地: 投稿: 8 |
Re: エンティティでのリポジトリの呼び出し方 ご回答ありがとうございます。
管理側でもいくつかエラーが出ているので,受注明細が持っているProductClassのIDでレコードを新規登録することにしました。 他にもリレーションが切れている場合がありそうなので,EntityUtil::isEmptyは検査等で使えそうです。 ありがとうございました! |
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系では非推奨メソッドとなっています。
|
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ですが,
エラーでひっかかるのは「orderItem.ProductClass.ClassCategory1」の行番号が出ており,なぜその上でnullの判定にならないのか?なのです…。 (実際{% if orderItem.ProductClass is not null %}のif文の間に別の文字列を入れてみるとエラーにならず表示されます。) 商品規格のリレーションが切れているのが異常な状態なのはその通りなのですが,2系の時のデータベースのデータを再確認してもデータは同じなので移行時に漏れたということもないようで,2系の時にどういう運用をしていたのかもわからないため,なぜ商品規格が物理削除されているのかも分からない状態です。 最低限フロント側にエラーを出したくないので,強制的に新規に商品規格を追加してしまおうかと考えているところです…。 |
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文を追加する事で判定する事は出来ると思います。
|
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 9:45
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: エンティティでのリポジトリの呼び出し方 個人的な感覚ですが、
エンティティクラス内でリポジトリを呼び出す事は出来ないのではないでしょうか? またリポジトリを呼び出せたとしても、問題の解決に繋がらないのではないかと思います。 今回、ご質問されている件ですが 経験上、一発でエラーを解決するのは難しいのではないかと思います。 理由としては、ECCUBEがリレーション先が物理削除されている場合でも正常に動作するようには作られていないからです。 (ECCUBEに限らずリレーション先のレコードが存在していない場合は異常な状態ではないかと思いますが...) 具体的にどこでエラーが発生しているか分からない為、予想でしかありませんが、 例えば、twig上で{{ OrderItem->ProductClass->product_code }}のようにProductClassエンティティのメンバへのアクセスを メソッドチェーンで記述されているような箇所があった場合、 メソッドチェーンを分解してtwigにnull判定を書き加える以外、回避する手段が無いように思います。 1つ1つエラーが発生する箇所を修正していく事になるのではないでしょうか?
|
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を直接書いてしまえれば…と思うのですが,それすらどこに書いてどう呼び出せばいいのか???なので…。 |
スレッド表示 | 古いものから | 前のトピック | 次のトピック | トップ |