バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
nicky
投稿日時: 2021/3/26 1:32
対応状況: −−−
新米
登録日: 2021/3/26
居住地:
投稿: 2
app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい
▼テンプレート
[EC-CUBE] 4.0を新規インストール
[レンタルサーバ] SAKURA VPSの最小構成
[OS] CentOS 8
[PHP] 7.3.27
[データベース] Ver 14.14 Distrib 5.7.33
[WEBサーバ] Apache/2.4.6
[ブラウザ] Google Chrome 89.0.4389.90(Official Build) (64 ビット)
[導入プラグインの有無] なし
[カスタマイズの有無] 既存Entiryへフィールド追加、新規Entityを作成(後述します)
[現象]
既存のユーザ情報に、新たな付加情報を追加しようと考えています。
Customerテーブルにフィールドを追加するだけに留めようと思いましたが、
Customerテーブルと OneToOne で紐づく別テーブル(CustomerChild)を追加する事に致しました。
※それとは別途、Customerテーブルへフィールドを追加しております。

ドキュメント等を見ながら、CustomerChildEntityの作成とそれに伴うテーブルの作成までは出来ました。
手動で、DBのCustomerChildテーブルにデータを登録し、EC-CUBE側での取得が正しく行えているかどうか検証したところ
Controller内での getUser() 及び、Templateでの app.user のどちらもデータが取得できませんでした。
正確には、プロパティ自体は存在しているが中身が NULL という状態です。

対応手順としましては以下の通りです。
長文で恐縮ですが、出来るだけ詳細をお伝えさせて頂きたく思います。


1.先にCustomerへのフィールドを追加しました。
・Customize/Entity/CustomerTrait.php を作成
    /**
     * @ORM\Column(name="test_msg", type="string", nullable=false)
     * @Eccube\FormAppend
     * @Assert\NotBlank(message="入力してください。")
     */
    private $test_msg;

    /**
     * @return string
     */
    public function getTestMsg()
    {
      return $this->test_msg;
    }

    /**
     * @param string|null $test_msg
     * @return Customer
     */
    public function setTestMsg($test_msg)
    {
      $this->test_msg = $test_msg;
      return $this;
    }
 このタイミングで一度、doctrine:schema:update を実行してフィールド追加を確認しました。


2.CustomerにOneToOneで紐づくCustomerChildのEntityを作成しました
  リレーションに関わる部分のみ抜粋です、コンストラクタ無し、他の処理は全てプロパティの getter / setter です
  同じOneToOne構成の src/Eccube/Entity/ProductClass 及び src/Eccube/Entity/TaxRule を参考にしました。
  なお、JoinColumnで指定している customer_id はプロパティ及び getter / setter は全て未定義です
  (参考にしたEntityでも同様の未定義状況でした)

    /**
     * @var \Eccube\Entity\Customer
     *
     * @ORM\OneToOne(targetEntity="Eccube\Entity\Customer", inversedBy="CustomerChild")
     * @ORM\JoinColumns({
     *  @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
     * })
     */
    public $Customer;

    /**
     * Set customer.
     *
     * @param \Eccube\Entity\Customer|null $customer
     *
     * @return CustomerChild
     */
    public function setCustomer(\Eccube\Entity\Customer $customer = null)
    {
      $this->Customer = $customer;
      return $this;
    }

    /**
     * Get customer.
     *
     * @return \Eccube\Entity\Customer|null
     */
    public function getCustomer()
    {
      return $this->Customer;
    }


3.手順1で作成した CustomerTrait にリレーションの定義を追加しました
  追記部分のみ抜粋です
   /**
    * @var \Customize\Entity\CustomerChild
    *
    * @ORM\OneToOne(targetEntity="\Customize\Entity\CustomerChild", mappedBy="Customer", cascade={"persist","remove"})
    */
   private $CustomerChild;

   /**
    * Set customerChild.
    *
    * @param \Customize\Entity\CustomerChild|null $customerChild
    *
    * @return Customer
    */
   public function setCustomerChild(\Customize\Entity\CustomerChild $customerChild = null)
   {
     $this->CustomerChild = $customerChild;
     return $this;
   }

   /**
    * Get customerChild.
    *
    * @return \Customize\Entity\CustomerChild|null
    */
   public function getCustomerChild()
   {
     return $this->CustomerChild;
   }

4.追加 Entity 用の CustomerChildRepository を作成しました
   /**
    * CustomerChildRepository constructor.
    *
    * @param RegistryInterface $registry
    * @param Queries $queries
    * @param EntityManagerInterface $entityManager
    * @param EccubeConfig $eccubeConfig
    */
   public function __construct(
     RegistryInterface $registry,
     Queries $queries,
     EntityManagerInterface $entityManager,
     EccubeConfig $eccubeConfig
   ) {
     parent::__construct($registry, CustomerChild::class);
     $this->queries = $queries;
     $this->entityManager = $entityManager;
     $this->eccubeConfig = $eccubeConfig;
   }

   public function newCustomerChild()
   {
     $CustomerChild = new \Customize\Entity\CustomerChild();
     return $CustomerChild;
   }

   /**
    * Remove CustomerChild
    *
    * @param \Customize\Entity\CustomerChild $CustomerChild
    */
   public function delete($CustomerChild)
   {
     $em = $this->getEntityManager();
     $em->remove($CustomerChild);
     $em->flush($CustomerChild);
   }

5.doctrine:schema:update を実行し、新規テーブルに手動でデータを追加
  新規 Entity の定義に伴い、DBに新規テーブル「dtb_customer_child」が作成されました。
  phpMyAdminで直接、dtb_customer_child に既存の Customer データと紐づく情報を書き加えました。
  「select * from dtb_customer inner join dtb_customer_child on dtb_customer.id = dtb_customer_child.customer_id」のクエリで
  データが取得できることまで確認しました。

6.Contoller にて以下の処理を実行したが、中身はNULLだった
  /**
   * @Route("/", name="homepage")
   * @Template("top.twig")
   */
  public function index()
  {
    $Customer = $this->getUser();
    $CustomerChild = $Customer->getCustomerChild();
    dump($CustomerChild);
    return [];
  }

7.Template にて以下の処理を実行したが、中身は同様にNULLだった
  dump( app.user.customerChild )

---

以上、誤りもしくは不足部分等ありましたらご指摘頂けますでしょうか。
宜しくお願い致します。
tsuji
投稿日時: 2021/3/26 9:38
対応状況: −−−
仙人
登録日: 2013/11/19
居住地:
投稿: 926
Re: app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい
nicky 様

直感では新規で作られたテーブルにdiscriminator_typeがあり
この中身が入っていないのではないかと思いました。

プログラム側で確かめるとしたら
CustomerChildをRepositoryから直接取得してみて値が入っているかを
確かめるのが良いかと思います。

値が取れるのであれば別問題ですし、
値が取れないとなったら対象レコードを確認することになるかと思います。


----------------
****************************************
株式会社システムフレンド
辻 拓也(takuya tsuji)
改造専門店・EC-CUBE工房
****************************************

nicky
投稿日時: 2021/3/26 20:51
対応状況: 解決済
新米
登録日: 2021/3/26
居住地:
投稿: 2
Re: app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい
tsuji 様

返信有難う御座います。
先に結論から申しますと、現象は解決致しました。

手動で登録したデータを確認したところ、discriminator_typeには適当に"1"を設定しておりました。
今回はなるべく実動作に即した方法でデータを投入した方が良いと思い、
entityManager から persist で登録したところ、discriminator_typeには「customerchild」が設定されました。

上記の状態で、Repositoryからデータを取得したところ、目的のデータは正しく取得する事が出来ました。
  $Customer = $this->getUser();
  $CustomerChild = $this->customerChildRepository->findOneBy(
   [
    'Customer' => $Customer,
   ]
  );

ここまで確認したうえで、改めて getUser() の内容を確認したところ
データの取得が確認出来ました。


discriminator_type については不勉強だったため、こちらの方も確認しつつ作業を進めていこうと思います。
この度は誠に有難う御座いました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は70,501名です
総投稿数は100,697件です

投稿数ランキング

1
seasoft
7333
2
468
2922
3
AMUAMU
2712
4
nanasess
2127
5
umebius
1931
6
yuh
1612
7
red
1437
8
h_tanaka
1076
9
tsuji
926
10
fukap
907
11
shutta
835
12
tao_s
793
13 ramrun 789
14 karin 689
15 sumida 641
16
homan
633
17 DELIGHT 572
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

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

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