Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
20
Help us understand the problem. What is going on with this article?
@yutachaos

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

More than 3 years have passed since last update.

前置き

  • 既存のプロジェクトの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

20
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
yutachaos
Programmer,Bassist,Bibliomania
recruitmp
結婚・カーライフ・進学の情報サイトや『スタディサプリ』などの学びを支援するサービスなど、ライフイベント領域に関わるサービスを提供するリクルートグループの中核企業

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
20
Help us understand the problem. What is going on with this article?