LoginSignup
14
24

More than 5 years have passed since last update.

symfonyで既存テーブルからEntityやCRUDを自動生成する。

Last updated at Posted at 2017-07-18

前置き

  • 既存のプロジェクトのreplaceだったり、要件的にまずテーブル設計を終わらせてから実装に入る事はよくあると思います。
    その際にテーブル内容から手作業でEntityを作成するのは面倒かつミスの元です。symfonyにはdoctineを利用した既存テーブルからentityを作成する機能があるので活用しましょう。

実行環境

  • php 7
  • symfony(2.7)

内容

  • テーブルを作成する。
  • 作成したテーブルを元にEntityクラスを作成する。
  • 作成したEntityクラスを元にCRUDやFormクラスを作成する。

テーブルを作成する

  • 下記のテーブルを作成する。
CREATE TABLE `to_do` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `task` tinyint(1) NOT NULL,
  `type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `memo` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `date` date NOT NULL,
  `r_datetime` datetime DEFAULT NULL,
  `u_datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

作成したテーブルを元にEntityクラスを作成する。

  • doctrine:mapping:convertを使う
    • コマンド
      • doctrine:mapping:convert [--filter FILTER] [-f|--force] [--from-database] [--extend [EXTEND]] [--num-spaces [NUM-SPACES]] [--namespace [NAMESPACE]] [--em [EM]] [--] <to-type> <dest-path>
  • データベースから作成する場合
    • --from-database オプションを利用する。
    • php app/console doctrine:mapping:convert 出力種別 出力ディレクトリ --from-database
      • php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity --from-database
        - 複数のDB設定を使い分けている場合
    • --emオプションを使う
    • php app/console doctrine:mapping:convert 出力種別 出力ディレクトリ --from-database --em="entity_manager名"
      • php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity --from-database --em="sub"
  • namespaceを付与したい場合
    • --namespaceオプションを使う。
    • escapeが必要なので注意
    • php app/console doctrine:mapping:convert 出力種別 出力ディレクトリ --from-database -namespace="namespace名"
      • php app/console doctrine:mapping:convert annotation ./src --from-database -namespace="AppBundle\\Entity\\"
  • 指定のテーブルのみに実行したい場合
    • filterオプションを使う。
    • create tableの時の名前ではなく、table名から生成されるキャメルケースの名前なので注意 例 to_doToDo
    • php app/console doctrine:mapping:convert 出力種別 出力ディレクトリ --from-database --filter="テーブル名"
      • php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity --from-database --filter="ToDo"

作成したEntityからの自動生成

共通項目

  • doctrine:generateコマンドを利用する。
  • 対象指定方法
    • Bundle名での指定
      • Bundle名のみの指定でそのbundleにある全てのEntityに対して実行される。
      • doctrine:generate:コマンド名 bundle名
    • Entityでの指定
      • Entityへの指定
        • Bundle名:Entity名で指定する
      • namespaceの指定
        • doctrine:generate:コマンド名 namespace
  • よく使うオプション
    • --no-backup
      • entityのbackupファイルを作成しない

getter setterを追加

  • doctrine:generate:entitiesを使う
  • bundle指定
    • php app/console doctrine:generate:entities AppBundle
  • entity指定
    • php app/console doctrine:generate:entities AppBundle:Todo
  • namespace指定
    • php app/console doctrine:generate:entities AppBundle/Entity/Todo

formを生成する

  • doctrine:generate:formを使う
  • bundle指定
    • php app/console doctrine:generate:form AppBundle
  • entity指定
    • php app/console doctrine:generate:form AppBundle:Todo
  • namespace指定
    • php app/console doctrine:generate:form AppBundle/Entity/Todo

crudを生成する

  • doctrine:generate:crudを使う
  • entityからview,form,controllerの雛形を生成する。
  • bundle指定
    • php app/console doctrine:generate:crud AppBundle
  • entity指定
    • php app/console doctrine:generate:crud AppBundle:Todo
  • namespace指定
    • php app/console doctrine:generate:crud AppBundle/Entity/Todo

コンソール

bundle名:entity名
You must use the shortcut notation like AppBundle:Todo [ENTER]

編集処理が必要か?(noだと新規登録、編集機能が生成されない)
Do you want to generate the "write" actions [no]? yes [ENTER]

Determine the format to use for the generated CRUD.

フォーマットの指定
Configuration format (yml, xml, php, or annotation) [annotation]: [ENTER]
Determine the routes prefix (all the routes will be "mounted" under this
prefix: /prefix/, /prefix/new, ...).

URLプレフィックスの指定
Routes prefix [/todo]: [ENTER]

最後の確認
Do you confirm generation [yes]?  [ENTER]

参考URL

14
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
24