2012年05月08日
講義059日目
------------------------------1H------------------------------
★データベース移行
●xamppの「study」データベースを移行する
・
①mysql基礎の内容と同じようにユーザを作成しておく
・use mysql
・コピーしたcreate文を実行する
↓
CREATE TABLE `servers` (
`Server_name` char(64) NOT NULL,
`Host` char(64) NOT NULL,
`Db` char(64) NOT NULL,
`Username` char(64) NOT NULL,
`Password` char(64) NOT NULL,
`Port` int(4) DEFAULT NULL,
`Socket` char(64) DEFAULT NULL,
`Wrapper` char(64) NOT NULL,
`Owner` char(64) NOT NULL,
PRIMARY KEY (`Server_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MySQL Foreign Servers table';
・show tables;
テーブルのリストが出てくるので、「servers」がいることを確認
上記後studyデータベースに触りたい場合は「use study」を打つ
②studyデータベースを作っておく
(study.sqlを消した人
・xamppを立ち上げて、mysqlサーバを立てておく
・mysqldump -u ユーザ名 -p study > C:\study.sql
ドライブのパスは任意)
中身はxamppからもってくる
③Windows側のstudy.sqlをFFFTPないしeclipseを使用してサーバに移動する
④mysqlコマンドでstudy.sqlをインポートする
例えば、ホームディレクトリにsutudy.sqlを移動したなら
cd
mysql -u ユーザ名 -p
use study
status
show tables
で確認する
------------------------------2H------------------------------
★symfony
●MVC
・M
ここを学習する
・V
テンプレートなど
・C
action.class.phpなど
●/configフォルダ
・.yml
設定ファイル、記述ルールがあるテキストファイル
・database.yml
symfonyのDB接続情報が欠かれる設定ファイル
#all:
# propel:
# class: sfPropelDatabase
# param:
# dsn: mysql://root@localhost/dbname
・#
コメントアウト
デフォルトでコメントアウトされてる
・インデント
インデントが重要な役割
インデントによって階層構造を表現してる
・書き換える
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://nishi:mis019@localhost/study
encoding: utf8
●propel.ini
☆O/R(オブジェクトリレーション)マッパー
他のテーブルとの連携がとれるDB
リレーショナルDBをロジックと結びつけられるマッピング(紐付け)技術をO/Rマッパーという
O/Rマッパの一つがpropel
O→Criteria
R→mysql
・propel
symfonyにおけるO/Rマッパ
・Criteria(Criteriaクラス)
symfonyにおける、O/Rマッパのオブジェクト側のロジック
propel.database.createUrl = mysql://root@localhost/
propel.database.url = mysql://root@localhost/sf.shonanbbs.com
↓
propel.database.createUrl = mysql://nishi:mis019@localhost/
propel.database.url = mysql://nishi:mis019@localhost/study
●schema.yml
symfonyがデータベースを情報を扱うために、「schema.yml」が必要
schema.ymlを作成するsymfonyコマンド
・symfony propel-build-schema
schema.ymlにDBの内容を書き込むコマンド
・symfony propel-build-model
/lib/model内に
/lib/model/map
/lib/model/om
●lib/model/
symfony上で。MVCの「M」にあたる処理が格納されてるディレクトリ
------------------------------3H------------------------------
★symfony
●Criteriaを使って、データベース情報取得
・/apps/front/modules/default/actions/action.class.php
public function executeIndex()
{
//Criteriaを使って、データベース情報取得
$c = new Criteria();
$c->add(MemberPeer::ID,3);
print_r(MemberPeer::doSelectOne($c));
//select * from member where id = "3" limit "1";と同じ
☆//doselect 条件に一致したレコード全てを配列で取得
☆//doselectOne:条件に一致したレコードのうち1つ目のみ取得
return sfView::SUCCESS;
//$this->forward('default', 'module');
}
●エラーメッセージを表示するようにする
/web/index.php
define('SF_ENVIRONMENT', 'prod');
define('SF_DEBUG', false);
↓書き換えてデバックモードに
define('SF_ENVIRONMENT', 'dev');
define('SF_DEBUG', true);
運用する場合は元に戻す
●検索条件の操作
・$c->add(MemberPeer::ID,3, Criteria::EQUAL);
・$c->add(MemberPeer::ID,3, Criteria::GRATER_THAN);
より上
・$c->add(MemberPeer::ID,3, Criteria::GREATER_EQUAL);
以上
・$c->add(MemberPeer::ID,10, Criteria::LESS_THAN);
より下
・$c->add(MemberPeer::ID,10, Criteria::LESS_EQUAL);
以下
などがある
------------------------------4H------------------------------
★Criteriaを使って、データベース情報取得
●
{
//Criteriaを使って、データベース情報取得
$c = new Criteria();
$c->add(MemberPeer::ID,3, Criteria::GREATER_EQUAL);
//Criteria::EQUALのみ省略可
$member = MemberPeer::doSelectOne($c);
//select * from member where id = "3" limit "1";と同じ
//doselect 条件に一致したレコード全てを配列で取得
//doselectOne:条件に一致したレコードのうち1つ目のみ取得
echo $member->getMailaddress();
//カラム名でメソッドが作られている
return sfView::SUCCESS;
//$this->forward('default', 'module');
}
●Criteriaを使わずに静的にデータを取得
・$member = MemberPeer::retrieveByPk(1);
●テンプレート側で表示させる
オブジェクトごとテンプレートに渡す
●ln -s /usr/share/pear/data/symfony/web/sf ./sf
シンボリックリンクを作り、デバックモードでの見た目を良くするファイルを読む
------------------------------5H------------------------------
★Criteria
●複数のテーブルの連携
・外部キーの設定
schema.yml
reply
required: true
foreignTable: comment
外部キーの対象を指定
foreignReference: id
対象のカラムを指定
・[nishi@localhost sf.shonanbbs.com]$ symfony propel-build-model
手動でschema.ymlを更新した内容をmodelに反映
・replyを追加する
$rep = new Reply;
$rep->setNickname("test");
$rep->setContent("testtest");
$rep->setCommentId(1);
$rep->save();
ページを更新するたびにreplyが追加されていくロジック
・外部キーのテーブルの該当するもの全て
$comment = CommentPeer::retrieveByPk(1);
print_r($comment->getReplys());
・外部キーの元になっているレコード
$reply = ReplyPeer::retrieveByPk(1);
print_r($reply->getComment());
------------------------------6H------------------------------
★Criteria
●実際に掲示板で使用する情報を表示する
・action.class.php
$this->comments = CommentPeer::doSelect($c = new Criteria);
・indexSuccess.php
<?php foreach($comments as $comment):?>
<?php echo htmlspecialchars($comment->getNickname())?>さんの投稿<br>
<?php echo htmlspecialchars($comment->getContent())?>
<hr>
<?php endforeach;?>
●replyも表示してみる
・indexSuccess.php
<?php foreach($comments as $comment):?>
<?php echo htmlspecialchars($comment->getNickname())?>さんの投稿<br>
<?php echo htmlspecialchars($comment->getContent())?>
<br>
<?php foreach($comment->getReplys() as $reply):?>
------------<br>
<?php echo htmlspecialchars($reply->getNickname())?>さんの投稿<br>
<?php echo htmlspecialchars($reply->getContent())?><br>
<?php endforeach;?>
<hr>
<?php endforeach;?>
-----------------------------memo------------------------------
0 件のコメント:
コメントを投稿