ブログチュートリアルでCakePHPに入門後、データモデリングに入門する
CakePHPのhasMany belongsTo hasAndBelongsToMany
CakePHPのブログチュートリアルを試すことで、CakePHPの大まかな使い方を把握することが出来ます。
ブログチュートリアルを実践した後は、データ構造の拡張を行うことで、並行して
- データベースのリレーション
- CakePHPのアソシエーション
上の2つのスキルを得ることが可能です。
Webアプリケーション開発における、システム設計のスキルをブログチュートリアルの延長上で学ぶことが出来ます。
前提知識
CakePHPのブログチュートリアルを終えていることを前提条件にしています。
ブログチュートリアルをまだ試していない人は上の2つのチュートリアルを試してCakePHPに入門してください。
これらのチュートリアルを実践することで、
- Postモデル
- Userモデル
上の2つのモデル、及び
- Postsテーブル
- Usersテーブル
2つのデータベーステーブルが作成されます。
このデータ構造を拡張し、データモデリングに入門していきます。
hasMany
ブログチュートリアルでは、モデルのアソシエーションについては解説されていません。そのため、PostモデルとUserモデルを連携させてみます。アソシエーション: モデル同士を繋ぐの解説によると、モデル間アソシエーションを
User hasMany Post
と表現できます。
言い換えると
- UserはたくさんのPostを持つ
- ブログユーザーはたくさんの記事を持つ
といった感じになります。
そのため、UserモデルにhasManyを設定します。
public $hasMany = 'Post';
追加するコードは、この一行のみです。Userモデルでfindを実行して、返されるデータ構造を確認してみます。
debug($this->User->findById(1));
ブログチュートリアルの通りにデータベースを定義していれば、1対多(1つのUserに対して複数のPost)のデータ構造が返されます。
array( 'User' => array( 'password' => '*****', 'id' => '1', 'username' => 'engineer', 'role' => 'admin', 'created' => '2014-12-01 17:56:01', 'modified' => '2014-12-01 17:56:01' ), 'Post' => array( (int) 0 => array( 'id' => '1', 'title' => 'タイトル', 'body' => 'これは、記事の本文です。', 'created' => '2014-12-01 20:11:58', 'modified' => null, 'user_id' => '1' ), (int) 1 => array( 'id' => '4', 'title' => 'テック記事', 'body' => 'Webシステム開発についての記事です', 'created' => '2014-12-01 17:57:24', 'modified' => '2014-12-01 17:57:24', 'user_id' => '1' ) ) )
belongsTo
UserモデルにhasManyを設定して、1対多のデータ構造を得ることが出来たので、逆の発想でPostモデルから多対1のデータ構造を取得してみます。その際に、
belongsTo
を使います。belongsToの場合は
Post belongsTo User
と表現することができ、日本語にすると
PostはUserに属する
といった感じになります。
PostモデルにbelongsToのアソシエーションを追加します。
public $belongsTo = 'User';
Controller側でPostモデルに対してfindを実行します。
$data = $this->Post->find('all', array( 'conditions'=>array( 'user_id' => '1' ) )); debug($data);
返されるデータ構造は以下の通りです。
array( (int) 0 => array( 'Post' => array( 'id' => '1', 'title' => 'タイトル', 'body' => 'これは、記事の本文です。', 'created' => '2014-12-01 20:11:58', 'modified' => null, 'user_id' => '1' ), 'User' => array( 'password' => '*****', 'id' => '1', 'username' => 'engineer', 'role' => 'admin', 'created' => '2014-12-01 17:56:01', 'modified' => '2014-12-01 17:56:01' ) ), (int) 1 => array( 'Post' => array( 'id' => '4', 'title' => 'テック記事', 'body' => 'Webシステム開発についての記事です', 'created' => '2014-12-01 17:57:24', 'modified' => '2014-12-01 17:57:24', 'user_id' => '1' ), 'User' => array( 'password' => '*****', 'id' => '1', 'username' => 'engineer', 'role' => 'admin', 'created' => '2014-12-01 17:56:01', 'modified' => '2014-12-01 17:56:01' ) ) )
belongsToの場合は、hasManyの場合と異なりフラットな配列のデータ構造が返されますが、findしたModelのデータに紐づくデータが返されており、結果として多対1のデータ構造が返されます。
ここまでの解説で、ブログチュートリアルのPostモデルとUserモデルを双方向から連携出来ることを確認しました。