symfony1.1.7 設定ファイルschema.ymlからテーブルを作成 2009 年 4 月 27 日

symfony Forms in Action 第4章 - Propelとの統合を動かすために、mysqlのデーターベースとテーブル作成が必要となる。
以下のページのconfig/database.ymlやconfig/schema.ymlファイルからsymfonyコマンドでmysqlのデータベースとテーブルを作成する。
リスト4-1 - データベーススキーマ

何はともあれ以下をコピペして、config/schema.ymlに貼り付ける

PHP
propel:
  article:
    id:           ~
    title:        { type: varchar(255), required: true }
    slug:         { type: varchar(255), required: true }
    content:      longvarchar
    status:       varchar(255)
    author_id:    { type: integer, required: true, foreignTable: author, foreignReference: id, OnDelete: cascade }
    category_id:  { type: integer, required: false, foreignTable: category, foreignReference: id, onDelete: setnull }
    published_at: timestamp
    created_at:   ~
    updated_at:   ~
    _uniques:
      unique_slug: [slug]

  author:
    id:           ~
    first_name:   varchar(20)
    last_name:    varchar(20)
    email:        { type: varchar(255), required: true }
    active:       boolean

  category:
    id:           ~
    name:         { type: varchar(255), required: true }

  tag:
    id:           ~
    name:         { type: varchar(255), required: true }

  article_tag:
    article_id:   { type: integer, foreignTable: article, foreignReference: id, primaryKey: true, onDelete: cascade }
    tag_id:       { type: integer, foreignTable: tag, foreignReference: id, primaryKey: true, onDelete: cascade }

config/database.ymlの設定

all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://ログインID:ログインパスワード@localhost/データーベース名
username: root
password: root
encoding: utf8

※ymlファイルなので、改行など注意

config/propel.iniを設定

propel.targetPackage = lib.model
propel.packageObjectModel = true
propel.project = myproject
propel.database = mysql
propel.database.createUrl = mysql://root:root@localhost/
propel.database.url = mysql://ログインID:ログインパスワード@localhost/データーベース名

※ymlファイルなので、改行など注意

config/schema.ymlの準備ができたので、schema-to-xmlコマンドを実行

symfony propel:schema-to-xml

config/schema.xmlが作成されたことを確認

ls -l config
total 32
-rw-rw-r– 1 sfuser sfuser 320 Apr 9 19:34 databases.yml
-rw-rw-r– 1 sfuser sfuser 3540 Apr 9 19:57 generated-schema-transformed.xml
-rw-rw-r– 1 sfuser sfuser 214 Apr 9 12:12 ProjectConfiguration.class.php
-rw-rw-r– 1 sfuser sfuser 2358 Apr 9 19:44 propel.ini
-rw-rw-r– 1 sfuser sfuser 27 Apr 9 12:12 properties.ini
-rw-rw-r– 1 sfuser sfuser 51 Apr 9 12:12 rsync_exclude.txt
-rw-rw-r– 1 sfuser sfuser 3540 Apr 9 19:55 schema-transformed.xml
-rw-rw-r– 1 sfuser sfuser 1156 Apr 9 19:51 schema.yml
-rw-rw-r– 1 sfuser sfuser 1156 Apr 9 19:57 schema.xml

データーベースを作成したいが自分の場合はすでにmysqlにログインして作成済みだったので、symfony propel:build-dbコマンドはスキップ

symfony propel:build-db

ここで注意しなければいけないのが、propel:build-sqlを実行する前にschema.xmlを削除する必要がある。

rm -rf config/schema.xml

そして、propel:build-sqlとpropel:insert-sqlコマンドを実行

symfony propel:build-sql
symfony propel:insert-sql

最後に、mysqlにログインしてテーブルが作成されたのを確認

mysql -uログインID -p データーベース名
mysql> show tables;
+———————+
| Tables_in_データーベース名 |
+———————+
| article |
| article_tag |
| author |
| category |
| tag |
+———————+
5 rows in set (0.00 sec)

propel:build-allコマンドを行った後でないと、propel:build-formsを実行しても
lib/form/BaseFormPropel.class.php
ファイル一つしかできないことになるので、以下を順番に実行

symfony propel:build-all
symfony propel:build-forms
$ ls -l lib/form

-rw-rw-r– 1 sfuser sfuser 247 Apr 9 20:33 ArticleForm.class.php
-rw-rw-r– 1 sfuser sfuser 260 Apr 9 20:33 ArticleTagForm.class.php
-rw-rw-r– 1 sfuser sfuser 243 Apr 9 20:33 AuthorForm.class.php
drwxrwxr-x 2 sfuser sfuser 4096 Apr 9 20:33 base
-rw-rw-r– 1 sfuser sfuser 244 Apr 9 19:06 BaseFormPropel.class.php
-rw-rw-r– 1 sfuser sfuser 251 Apr 9 20:33 CategoryForm.class.php
-rw-rw-r– 1 sfuser sfuser 231 Apr 9 20:33 TagForm.class.php

ls -l lib/form/base/
total 20
-rw-rw-r– 1 sfuser sfuser 3725 Apr 9 20:33 BaseArticleForm.class.php
-rw-rw-r– 1 sfuser sfuser 924 Apr 9 20:33 BaseArticleTagForm.class.php
-rw-rw-r– 1 sfuser sfuser 1262 Apr 9 20:33 BaseAuthorForm.class.php
-rw-rw-r– 1 sfuser sfuser 841 Apr 9 20:33 BaseCategoryForm.class.php
-rw-rw-r– 1 sfuser sfuser 2288 Apr 9 20:33 BaseTagForm.class.php

関連する記事:

Leave a Reply