質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Doctrine

Doctrineは、データベースの抽象性とPHPで書かれたORMを扱うためのオープンソースのライブラリとツールの集合です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Symfony

Symfony はPHPで記述されたWebアプリケーションフレームワークです。よく利用するコーディングをテンプレーティングするなど、Webアプリケーション開発の効率化を目的として設計されています。

Q&A

0回答

1562閲覧

【Symfony3】同一カラム構造のテーブルに対して動的にアクセスできるようにしたい

kinkswho

総合スコア8

Doctrine

Doctrineは、データベースの抽象性とPHPで書かれたORMを扱うためのオープンソースのライブラリとツールの集合です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Symfony

Symfony はPHPで記述されたWebアプリケーションフレームワークです。よく利用するコーディングをテンプレーティングするなど、Webアプリケーション開発の効率化を目的として設計されています。

0グッド

0クリップ

投稿2019/11/14 08:34

編集2019/11/14 08:54

前提・実現したいこと

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; } }

複数のテーブルに対してデータの読み込み、書き込みが可能な方法が分かる方が
いらっしゃったらご教示願えますでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問