Top / PHP関連 / symfonyのORM(Windows)

symfonyのORM(Windows)

symfonyは、自前でO/R Mapperのフレームワークを持っています。
symfonyで、RAD開発するのならば、symfonyが要求するルールどおりに、ERを構築しなければなりません。

ルール

  • PK(PrimaryKEY)は、[id]という名前を付ける。
  • 楽観的ロックを使用するために、[created_at],[updated_at]という名のカラムで作る。
  • テーブル間のリレーションは[テーブル名]+[_id]でリンクする。このとき、DBは外部キー制約をはる。

卵が先か、ニワトリが先か

DBA(DataBase Administrator)が居るプロジェクトの場合、スキーマからPHPコードを作ります。

 

では、DBAが居ないプロジェクトの場合は、どうしましょう。
自分は、これもスキーマからPHPコードを作ったほうが良いと考えます。

 

ymlのコードからDBスキーマを作るSQLコードも作ることもできますが、どうしてもER図などを作る必要があり、
ymlコードからER図を作るツールが存在しない(?)という状況から、DBスキーマからPHPコードを作ったほうが良いと考えます。

DB接続環境を整える

PHPからのDB接続環境を整えるため、php.iniを編集します。
ここでは、MySQLに接続するための設定を説明します。

以下のコメントアウトをはずします。

extension=php_mysql.dll
extension=php_pdo_mysql.dll
 
extension=php_mysqli.dll

php_mysqli.dllの読み込みは不要。かもしれません。

symfonyにDBへの接続の仕方を覚えさせる

いかのようにコマンドを投入します。ホスト名、接続DB名、ユーザー名、パスワードは適宜修正します。

symfony configure:database "mysql:host=localhost;dbname=techch" root mYsEcret

すると、config/databases.yml がこのように作成されます。(手で修正しても可)

dev:
  propel:
    param:
      classname: DebugPDO
test:
  propel:
    param:
      classname: DebugPDO
all:
  propel:
    class: sfPropelDatabase
    param:
      classname: PropelPDO
      dsn: 'mysql:host=localhost;dbname=techch'
      username: root
      password: mYsEcret
      encoding: utf8
      persistent: true
      pooling: true

[dev:] の欄は、開発用スキーマを指定します。
[test:] の欄は、結合(総合)テスト用のスキーマーを指定します。
[all:]の欄は、本番用のスキーバーを指定します。

 

この辺の詳しい説明と意味については、本家のマニュアルの「環境」という欄にそれとなく書かれて いますで、それを参考にしてください。

 

1日目: プロジェクトを始める
http://www.symfony-project.org/jobeet/1_2/Propel/ja/01

 

スキーマの情報からschema.ymlを作る

このコマンドを打つと、スキーマーから[schema.yml]を、自動で作ることができます。

symfony propel-build-schema

自動的に作成された[schema.yml]は、以下のようなファイルです。

propel:
  _attributes:
    package: lib.model
    defaultIdMethod: native
  affiliate:
    _attributes: { phpName: Affiliate }
    id: { type: INTEGER, size: '11', primaryKey: true, required: true }
    url: { type: VARCHAR, size: '255', required: true }
    email: { type: VARCHAR, size: '255', required: true }
    token: { type: VARCHAR, size: '255', required: true }
    is_active: { type: TINYINT, size: '1', required: true, defaultValue: '0' }
    create_at: { type: TIMESTAMP, required: true, defaultValue: CURRENT_TIMESTAMP }
    _uniques: { uk_email: [email] }
  category:
    _attributes: { phpName: Category }
    id: { type: INTEGER, size: '11', primaryKey: true, required: true }
    name: { type: VARCHAR, size: '255', required: true }
    _uniques: { uk_name: [name] }
  category_affiliate:
    _attributes: { phpName: CategoryAffiliate }
    category_id: { type: INTEGER, size: '11', primaryKey: true, required: true, foreignTable: category, foreignReference: id, onDelete: RESTRICT, onUpdate: RESTRICT }
    affiliate_id: { type: INTEGER, size: '11', primaryKey: true, required: true, foreignTable: affiliate, foreignReference: id, onDelete: RESTRICT, onUpdate: RESTRICT }
    _indexes: { fk_category_affiliate_affiliate: [affiliate_id], fk_category_affiliate_category: [category_id] }
  job:
    _attributes: { phpName: Job }
    id: { type: INTEGER, size: '11', primaryKey: true, autoIncrement: true, required: true }
    category_id: { type: INTEGER, size: '11', required: false, foreignTable: category, foreignReference: id, onDelete: RESTRICT, onUpdate: RESTRICT }
    type: { type: VARCHAR, size: '255', required: false }
    company: { type: VARCHAR, size: '255', required: true }
    logo: { type: VARCHAR, size: '255', required: false }
    url: { type: VARCHAR, size: '255', required: false }
    position: { type: VARCHAR, size: '255', required: true }
    location: { type: VARCHAR, size: '255', required: true }
    description: { type: LONGVARCHAR, required: true }
    how_to_apply: { type: LONGVARCHAR, required: true }
    token: { type: VARCHAR, size: '255', required: true }
    is_public: { type: TINYINT, size: '1', required: true, defaultValue: '1' }
    is_activated: { type: TINYINT, size: '1', required: true, defaultValue: '0' }
    email: { type: VARCHAR, size: '255', required: true }
    expires_at: { type: TIMESTAMP, required: true, defaultValue: CURRENT_TIMESTAMP }
    create_at: { type: TIMESTAMP, required: true, defaultValue: '0000-00-00 00:00:00' }
    updated_at: { type: TIMESTAMP, required: true, defaultValue: '0000-00-00 00:00:00' }
    _indexes: { fk_job_category: [category_id] }
    _uniques: { uk_token: [token] }

説明なしに[schema.yml]を見せてしまいましたが、symfonyの公式チュートリアル、
3日目: データモデル http://www.symfony-project.org/jobeet/1_2/Propel/ja/03
に書かれていたデータモデルです。
これをMYSQL用のスキーマ、[techch]に展開しました。

 

このスキーマを作るSQLは、以下のです。


このSQLを作るために、[MySQLWorkbench]を使用しました。
ER図を作りながら、SQL文を作ることができるので便利です。
データファイルは、以下です。

ORMモデルの作成

出来上がった、schema.ymlを元にして、phpのコードに変換します。

symfony propel:build-model
 

こんなエラーが発生してしまいました。設定漏れのようです。

D:\Apache\Apache2.2\htdocs\host2.localhost>symfony propel:build-model
>> schema    converting "D:/Apache/Apache2.2...lhost/config/schema.yml" 
to XML
>> schema    putting D:/Apache/Apache2.2/htd...ost/config/generated-schema.xml
>> propel    Running "om" phing task
[propel-om] Could not perform XLST transformation.  Make sure PHP has 
been compiled/configured to support XSLT.

D:\Apache\Apache2.2\htdocs\host2.localhost>

検索エンジンで引っかかるように、エラーの状態も残しておきます。

 

XSLTのサポートができるようにしないとだめです。

php.iniをエディットし、

extension=php_xsl.dll

を有効にします。

とりあえず、Apacheを再起動します。
もう一回、チャレンジです。

VH_04.png
 

コアダンプしました。でも、若干ですが動作が変わりました。

 

作成されたschema.ymlを若干修正します。
修正箇所は以下の通りです。

 
defaultValue: CURRENT_TIMESTAMP 
↓
defaultValue: '0000-00-00 00:00:00'

そうすると、このようになりました。

D:\Apache\Apache2.2\htdocs\host2.localhost>symfony propel:build-model
>> schema    converting "D:/Apache/Apache2.2...lhost/config/schema.yml" to XML
>> schema    putting D:/Apache/Apache2.2/htd...ost/config/generated-schema.xml
>> propel    Running "om" phing task
>> file-     D:/Apache/Apache2.2/htdocs/host...ost/config/generated-schema.xml
PHP Warning:  unlink
(D:/Apache/Apache2.2/htdocs/host2.localhost/config/generated-schema.xml): 
Permission denied in D:\php\PEAR\sym
fony\task\sfFilesystem.class.php on line 143
>> file-     D:/Apache/Apache2.2/htdocs/host...enerated-schema-transformed.xml
PHP Warning:  unlink
(D:/Apache/Apache2.2/htdocs/host2.localhost/config/generated-schema-transformed.xml): Permission denied in D:\
php\PEAR\symfony\task\sfFilesystem.class.php on line 143
>> autoload  reloading autoloading

書き込みができなかったようです。
フォルダに書き込み許可を与えると、以下のようにうまく動作しました。

D:\Apache\Apache2.2\htdocs\host2.localhost>symfony propel:build-model
>> schema    converting "D:/Apache/Apache2.2...lhost/config/schema.yml" to XML
>> schema    putting D:/Apache/Apache2.2/htd...ost/config/generated-schema.xml
>> propel    Running "om" phing task
>> file-     D:/Apache/Apache2.2/htdocs/host...ost/config/generated-schema.xml
>> file-     D:/Apache/Apache2.2/htdocs/host...enerated-schema-transformed.xml
>> autoload  reloading autoloading

D:\Apache\Apache2.2\htdocs\host2.localhost>

まだまだ、続く。

 
最新の10件
2010-07-09 2010-07-08 2010-07-07 2010-06-29 2010-06-28
人気の20件
Counter: 655, today: 1, yesterday: 0

添付ファイル: fileVH_04.png 38件 [詳細] filetechch.mwb 91件 [詳細] fileaaaa.sql 110件 [詳細]