Modelの設計
前回までの成果物はこちらに置いています。この章から読み進める人はそれをxamppのhtdocs以下の直接、置いてください。
この章ではModelを追加していきます。Modelは前にも説明したようにデータベースに関わる部分です。本ブログでは会員交流サイトのようなものを作っていきます。たとえば会員のデータベースの構造(名前・メールアドレス・年齢・・・etc)の定義などもModelを使って行います。
またデータベースをあまり使ったこともない人も多いと思いますので、ここでは習うより慣れろという感じで解説を進めていきます。
とりあえず本章では、これから作るサイトの会員のデータを扱うテーブル(データベース)を定義していきます。会員のデータとしては以下の要素があるものとします。
- id: 会員の通し番号
- e-mail: 会員のE-mailアドレス
- name: 会員の名前
上記のidはその会員の会員番号です。e-mailは、その会員のe-mailアドレスです。nameはその会員の名前です。
とりあえず今から上記の属性をもつテーブルを作ります。またテーブル名はuserとします。
phpmyadminからテーブルを追加
ではxamppからApacheとMYSQLを起動してください。http://localhost/phpmyadminを開きます。
これはphpmyadminと呼ばれるデータベースの管理ソフトです。もともとxamppの中に組み込まれているソフトウェアです。上記の画面が見えたらユーザ名にrootを、パスワードに第0章で決めたMySQLのパスワードを入力してください。(本ブログではunko9314と入力しました。)
この次に画面のデータベースを押してください。
すると以下の画面が現れるのでyiiと入力してください。(yiiが本ブログで使用するデータベースの名前です。実は名前はyiiでなくてもいいですが、面倒くさい人はyiiにしといてください。)
その後、画面左にあるyiiを押してください。
その後、userという名前のテーブルを作成しますが、すでに私がつくったものがあるので、それをそのまま使ってください。まずはこちらをダウンロードしてください。(user.sql)
具体的には以下のようにインポートを押します。
そして参照を押してください。そこに上記でダウンロードしたuser.sqlを指定して、実行してください。
これが成功するとyiiのデータベースの中にuserというテーブルが作られます。ちなみにサンプルとして一人分の会員データも一緒に記録してあります。あとでこれを表示させるプログラムを作ります。
これでphpmyadminの画面での操作は終了です。
protected\config\main.phpの設定(データベース接続情報)
まずはC:\xampp\htdocs\protected\config\main.phpを開きます。そこでyiiからMySQLに接続するための設定情報を入力します。
46行目あたりに以下のような記述があります。
'db'=>array( 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db', ), // uncomment the following to use a MySQL database /* 'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=testdrive', 'emulatePrepare' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8', ), */
いまはsqliteというものがデータベースに選ばれているので、それをMySQLに変更します。具体的には以下のように変更します。
//'db'=>array( // 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db', //), // uncomment the following to use a MySQL database 'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=yii',// dbname=yiiに変更する 'emulatePrepare' => true, 'username' => 'root', 'password' => 'unko9314', // ここを0章で設定したmysqlのパスワードに変更する 'charset' => 'utf8', ),
まず上の3行をコメントアウトしました。そのあと、dbname=yiiに変更するのと、(yiiはデータベースの名前でです。自分で違う名前にした人はその名前を使ってください) さらにpasswordの部分を0章で設定したMySQLのパスワードに変更します。本ブログではunko9314です。
giiによるModelの追加
前回の章と同じようにhttp://localhost/giiにアクセスしてください。その後、Model Generatorを開いてください。
そして以下の画面のように入力してください。
- テーブル名は、上記のphpmyadminの時にuserという名前のテーブルを作ったので、userとします。
- ModelClassはモデルのクラス名で、ここではUserとします。
そしてPreview→GenerateをすればUserという名前のModelが作成されます。(C:\xampp\htdocs\protected\models)
Modelのデータを表示してみよう
さて上記で作ったデータベースのデータに実際にアクセスしてみましょう。上記でも述べましたが先ほどデータベースにインポートしたuser.sqlには会員一人分のデータが保存されていました(以下の図を参照)。これを表示するプログラムを作ってみましょう。なおここで保存されているデータを会員番号1のユーザと呼びます。なぜならば、id(会員番号)が1だからです。
ここでの目標としてはhttp://localhost/user/testにアクセスしたときに会員番号1のユーザのメールアドレスを表示させます。
前の章で作ったc:\htdocs\protected\controllers\UserControler.phpを開いてください。ソースコードを以下のように編集します。
<?php class UserController extends Controller { public function actionIndex() { $this->render('index'); } // 会員番号1のユーザを表示 public function actionTest() { // データベースにアクセスする $user = User::model()->findByPk(1); // userのデータベースで会員番号1のものにアクセスする // Viewに表示をする $this->render('test',array('aaa'=>$user)); }
具体的な変更点はactionTestの中身です。
$user = User::model()->findByPk(1);
の部分についてはUserという名前のModelのクラス(この章で作ったModelですね)の中から、会員番号1のユーザを取得してくださいという内容の命令です。これを$userという変数に代入します。
findByPkについてですが、PkはPrimary Keyのことです。ここでは会員番号のことだと思ってください。ですので会員番号をもとにした検索命令だと考えてください。最後の(1)の1は会員番号1のことです。ここの1を2にすれば会員番号2のユーザを取得できますが、今はデータベースにそんなユーザは登録されていませんのでnullが返ってきます。
次に以下のソースですが、
$this->render('test',array('aaa'=>$user));
特に、
array('aaa'=>$user)
の部分ですが、C:\xampp\htdocs\protected\views\user\test.phpの中で$aaaという変数の中身にUserControllerで定義した$userを代入してくださいという意味です。
そこでC:\xampp\htdocs\protected\views\user\test.phpを開いてみましょう。以下のように編集してください。
<h1>テストです</h1> <p><?php echo $aaa->email;?></p>
ここで$aaaはUserControllerの$userの中身が入っています。$aaa->emailで会員番号1のユーザのemailのデータが取得できます。試しにhttp://localhost/user/testにアクセスしてください。
成功していれば以下のような画面が表示されるはずです。
本章では以上のようにデータベース・Modelの作成と、yiiのプログラムからのアクセスの方法を解説しました。
第4章での成果物はこちらに置いておきます。
- htdocs-chap4.zipはソースコードです。これはhtdocs直下に展開してください。
- user.sqlはデータベースの情報です。phpmyadminからyiiというデータベースを作ってその下にインポートしてください。