データモデル入門

ブログチュートリアルで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モデルを双方向から連携出来ることを確認しました。

ブログチュートリアルにCommentモデルを追加

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

データモデル入門の記事にコメントを投稿