前提・実現したいこと
Symfony、特にDoctrine,Entity周りの機能に詳しい方に質問です。
表題の件につきまして、同一カラム構造のテーブルが複数存在する前提で
それらのテーブルへ動的にデータの読み込み、書き込みを行う方法を教えていただきたいです。
・動作環境
PHP7.3.7
Symfony3.4.29
MySQL5.7.26
以下の「単一テーブルにアクセスする例」ではデータの読み込み、書き込みが可能なのですが、
例えば同一カラム構造のテーブルMainTerm1,MainTerm2・・・といったようにテーブルを複製して
それぞれのテーブルに対してテーブル名を指定する事でデータの読み込み、書き込みを
動的に行う、といった事は可能なのでしょうか。
分かる方がいればご教示願えますでしょうか。
単一テーブルにアクセスする例
(テーブル名:MainTermの例)
xxxController.php public function editAction(Request $request, $term_id){ $session = $request->getSession(); // get user information $user = $this->getUser(); $id = (int) $term_id; $em = $this->getDoctrine()->getManager(); $entityMain = $em->getRepository('CommonBundle:MainTerm')->findOneBy(array( 'termId' => $id, 'deleteFlag' => false )); ~(略)~ }
MainTerm.php namespace CommonBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; /** * MainTerm * * @ORM\Table(name="MainTerm") * @ORM\Entity(repositoryClass="CommonBundle\Repository\MainTermRepository") * @ORM\HasLifecycleCallbacks */ class MainTerm { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; ~(略)~ }
リンク内容
上記サイトを参考にテーブル名を動的に設定してアクセスする方法を試みたのですが、
"Call to a member function findOneBy() on null"というエラーメッセージが表示されます。
(下記の「複数テーブルに動的にアクセスする例」参照)
複数テーブルに動的にアクセスする例
(テーブル名:MainTermの例)
xxxController.php public function editAction(Request $request, $term_id){ $session = $request->getSession(); // get user information $user = $this->getUser(); $id = (int) $term_id; $em = $this->getDoctrine()->getManager(); $entity = $em->getClassMetadata('CommonBundle:MainTerm')->setTableName("MainTerm1")->findOneBy(array( 'termId' => $id, 'deleteFlag' => FALSE )); ~(略)~ }
MainTerm.php namespace CommonBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; /** * MainTerm * * @ORM\Table(name="NULL") * @ORM\Entity * @ORM\HasLifecycleCallbacks * @ORM\EntityListeners({"CommonBundle\Entity\Listener\MainTermListener"}) */ class MainTerm { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; ~(略)~ }
services.yml ~(略)~ dd.entity_listener.site_elec: class: CommonBundle\Entity\Listener\MainTermListener arguments: - "@security.token_storage" tags: - { name: doctrine.event_listener, event: loadClassMetadata }
MainTermListener.php namespace CommonBundle\Entity\Listener; use CommonBundle\Entity\User; use Doctrine\ORM\Event\LoadClassMetadataEventArgs; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; /** * Listener MainTerm. */ class MainTermListener { private $_tableName = null; protected $token_storage; public function getTableName() { return $this->_tableName; } public function setTableName($tableName) { $this->_tableName = $tableName; return $this; } public function __construct(TokenStorageInterface $token_storage) { $this->token_storage = $token_storage; if($token_storage->getToken() != null){ } } /* * @ORM\LoadClassMetadata * @param LoadClassMetadataEventArgs $eventArgs */ public function loadClassMetadata(LoadClassMetadataEventArgs $args) { $classMetadata = $args->getClassMetadata(); $table = $classMetadata->table; } }
複数のテーブルに対してデータの読み込み、書き込みが可能な方法が分かる方が
いらっしゃったらご教示願えますでしょうか。
あなたの回答
tips
プレビュー