前置き
- 既存のプロジェクトの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_do
→ToDo
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
- doctrine:generate:コマンド名
- Entityへの指定
- Bundle名での指定
- よく使うオプション
-
--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]