忍者ブログ

uthorofotus iruc

プログラムを組むために考えたり憶えたりした、いろいろなことを記録していきます。タイトルの読みは「ウソロフォトス イルーク」

[15]  [14]  [13]  [12]  [11]  [10]  [9]  [8]  [7]  [6]  [5

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

askeet day two:setting up a data model の解説

昨日の引き続き、askeetの2日目です。

2日目はデータベース接続できるように設定をして、アプリケーションの足場(scaffolding)をsymfonyに作らせます。2日目が終われば、アプリケーションを作っているという実感がもてるはずです。

長くなりそうなので、トラブルへの対応については別記事にします。


2日目の日本語チュートリアルはこちら本家英語版はこちらです

■おさらい(Previously on symfony)
2日目ではデータベースに接続してデータの更新ができるようになります。symfony→Propel→データベースと他のシステムを経由するので、トラブルが起きやすいです。

■プロジェクトを公開する(The project unveiled)
askeetがどんなサイトなのか説明がされています。実は完成したaskeetサイトはhttp://www.askeet.com/で稼働しています。日本語のサイトで似たようなものといえば、はてなの人力検索、教えてgoo、Yahoo知恵袋といったところでしょうか?askeetサイトを見ると、xhtml+cssでページデザインをして、Ajaxでユーザインターフェースを実装しているのが古いサイトとの違いに見えます。

■どこから始めるか(Where to start?)
リレーショナルデータモデル、つまりデータベースに格納するデータ構造から作っていくようです。データベースシステムはPHPとの連携でよく使われるMySQLです。もし、SQLiteを使うのなら本家のwikiに設定方法が書いてありますので、それをみるとよいでしょう。

■データモデル(Data Model)
データベースのテーブル構造をsymfonyに登録します。

▽リレーショナルモデル(Relational model)
5テーブルの構造をxmlで指定しています。

  • Userテーブル
    質問/回答するユーザの名前などを格納する。
    例:「Francois Zaninottoさん」「Fabien Potencierさん」
  • Questionテーブル
    質問内容と、どのユーザが質問したかを格納する。
    例:「質問ID3 Francoisさんからの質問、ブログへのアクセスを増やすにはどうしたらいいですか?」
  • Answerテーブル
    回答内容と、どの質問対して、どのユーザからの回答かを格納する。
    例:「回答ID5 質問(ID3 )へFabienさんからの回答、symfonyでblogを作りなさい。みんな気に入ってくれるでしょう。」
  • Interstテーブル
    どのユーザがどの質問に興味を持ったかを格納する。
    例:「Francoisさんは質問(ID3) に興味をもっています」
  • relevancyテーブル
    どのユーザがどの回答をどう(良い/悪い)評価したかを格納する。
    例:「Francoisさんは回答(ID5)を良い(スコア+1)と評価しています」

上記の5テーブルの構成(=schema)を、チュートリアルではconfig/schema.xmlに記述しています。これは、PeopelがXML形式のデータを読み込む仕様のためXMLになっているのです。ただ、今のsymfonyはschemaをYAML形式で書けば、symfonyがXMLに変換してくれるようになりました。schemaも、他のsymfony設定ファイルと同じようにYAMLで書いた方が分かりやすいかと思いますので、YAML形式で書いた方がよいでしょう。
チュートリアルのXMLと同じ内容をconfig/schema.ymlに書くと、以下のようになります。

propel:
  ask_question:
    _attributes:  { phpName: Question }
    id:          
    user_id:     
    title:        longvarchar
    body:         longvarchar
    created_at:  
    updated_at:  
  ask_answer:
    _attributes:  { phpName: Answer }
    id:          
    question_id: 
    user_id:     
    body:         longvarchar
    created_at:  
  ask_user:
    _attributes:  { phpName: User }
    id:          
    nickname:     varchar(50)
    first_name:   varchar(100)
    last_name:    varchar(100)
    created_at:  
  ask_interest:
    _attributes:  { phpName: Interest }
    question_id:  { type: integer, primaryKey: true, foreignTable: ask_question, foreignReference: id }
    user_id:      { type: integer, primaryKey: true, foreignTable: ask_user, foreignReference: id }
    created_at:  
  ask_relevancy:
    _attributes:  { phpName: Relevancy }
    answer_id:    { type: integer, primaryKey: true, foreignTable: ask_answer, foreignReference: id }
    user_id:      { type: integer, primaryKey: true, foreignTable: ask_user, foreignReference: id }

    score:        integer
    created_at:  

※2007/2/25訂正 Relevancy のカラム名が間違っていました。question_idではなく、answer_idとすべきでした。
※2007/3/3訂正、IntersrtとRelevancyのprimaryKeyが上手く設定できていませんでした。

チュートリアルのschema.xmlと見比べると、foreign-keyやidのinteger型指定などいくつか記述がschema.ymlには書かれていません。これは、symfonyがXMLに変換する際に補ってくれるので書かなくても良いのです。
schema.xmlのかわりにschema.ymlを用意して、"symfony propel-convert-yml-schema"を実行してみてください。schema.xmlが生成されます。チュートリアルと(ほぼ)同じ内容のXMLになるはずです。

もし、以前askeetチュートリアルをやっていて、すでにデータベースが用意されている場合は、"symfony propel-build-schema"を実行してschemaを生成する方法が書かれています。この先のチュートリアルをすすめるためには、生成されたschema.xmlの内容を修正しておく必要があります。それは、phpNameの値です。phpNameにはテーブル名がそのまま入ってしまっていますので、チュートリアルのschema.xmlを参考に、定義を修正しておいてください。phpNameの名前をPHPコード内で使用していきますので、今後のチュートリアルそのままの手順では上手く動かなくなります。

▽オブジェクトモデルの構築(Object model build)
Modelを作成する前に、config/propel.iniの"propel.builder.addComments"を"true"にしておくのがいいかもしれません。この指定は、Propelがコードを生成する際にコメントを入れるかの指定です。英語になりますが、コメントがあった方がModelのソースを追っていく際に処理内容がわかりやすくなります。

■データベース(The database)
symfonyにデータベースの構造を設定しましたので、データベース内にテーブルを作成していきます。symfonyがテーブル作成用のSQLを生成してくれますので、それを使います。

▽接続(Connection)
データベースの作成の際は文字コードの指定をUTF-8にしておいた方がいいでしょう。databases.ymlの設定ではDSN形式も使用できます。どうせpropel.iniでもdsnで指定しますので、こちらもdsnで書いてしまったほうが書式が統一されていて良いでしょう。DSN形式でのconfig/databases.ymlの設定例です。

all:
  propel:
    class:          sfPropelDatabase
    param:
      dsn:  mysql://youruser:yourpasswd@localhost/askeet

▽構築(Build)
チュートリアルの内容は少々古いです。propel-build-sqlを実行しますと、SQLはaskeet/data/sql/lib.model.schema.sqlに生成されます。また、このSQLをデータベースへ実行するsymfonyコマンドが用意されましたのでmysqlコマンドを使う必要はありません。なお、"propel~"とついたsymfonyコマンド実行した際、databases.ymlではなく、propel.iniの設定を使ってデータベースへ接続しますので注意してください。

symfony propel-insert-sql

■CRUDを通したテストデータアクセス(Test data access via a CRUD)
schema生成が上手く行けば、symfonyが全部やってくれますので楽です。こんなページが表示されるはずです。
propel-crudのトップページ

■ではまた、明日(See you Tomorrow)
schema生成、データベースへの接続のあたりが、一番トラブルが起こりやすい場所ではないでしょうか。3日目は2日目で作った足場を元に、デザインの変更や機能の追加などいろいろと手を加えていきます。3日目を超えてしまえば、チュートリアルの指示に沿えばそうそうトラブルに遭うことはないでしょう。前半の山場はもうちょっとですので頑張りましょう。

PR

この記事にコメントする

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字

この記事へのトラックバック

この記事にトラックバックする:

askeet day two:setting up a data model のトラブル HOME askeet day one:starting up a project の解説

プロフィール

HN:
flyfront
性別:
非公開
自己紹介:
PHPプログラマ。東京でsymfonyな仕事してます。

Wassr

カレンダー

02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

最新コメント

[01/02 通りすがり]
[10/18 flyfront]

バーコード

アクセス解析

忍者ブログ [PR]
Template by repe