質問 > フロント機能 > app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい |
フロント機能
スレッド表示 | 古いものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
nicky |
投稿日時: 2021/3/26 20:51
対応状況: 解決済
|
新米 登録日: 2021/3/26 居住地: 投稿: 5 |
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 については不勉強だったため、こちらの方も確認しつつ作業を進めていこうと思います。 この度は誠に有難う御座いました。 |
tsuji |
投稿日時: 2021/3/26 9:38
対応状況: −−−
|
仙人 登録日: 2013/11/19 居住地: 投稿: 958 |
Re: app.user 或いは getUser() で新規追加したリレーションEntityを取得させたい nicky 様
直感では新規で作られたテーブルにdiscriminator_typeがあり この中身が入っていないのではないかと思いました。 プログラム側で確かめるとしたら CustomerChildをRepositoryから直接取得してみて値が入っているかを 確かめるのが良いかと思います。 値が取れるのであれば別問題ですし、 値が取れないとなったら対象レコードを確認することになるかと思います。
|
nicky |
投稿日時: 2021/3/26 1:32
対応状況: −−−
|
新米 登録日: 2021/3/26 居住地: 投稿: 5 |
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 ) --- 以上、誤りもしくは不足部分等ありましたらご指摘頂けますでしょうか。 宜しくお願い致します。 |
スレッド表示 | 古いものから | 前のトピック | 次のトピック | トップ |