2つのテーブルを結合した場合のpaginate
今回は以下の2つのテーブルがあり、img_filesテーブルのuser_idがusersテーブルのidです。img_filesテーブルからデータを読取る時にusersテーブルのnameも表示するために同時に読取ります。usersテーブルのidは表示には必要ありません。
CREATE TABLE IF NOT EXISTS users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
userid CHAR(20) NOT NULL UNIQUE,
name CHAR(20) NOT NULL,
password CHAR(50) NOT NULL,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
)
CREATE TABLE IF NOT EXISTS img_files (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(255) NOT NULL DEFAULT '',
filepath VARCHAR(255) DEFAULT NULL,
mimetype VARCHAR(20) DEFAULT NULL,
info TEXT DEFAULT NULL,
size INT UNSIGNED DEFAULT NULL,
content MEDIUMBLOB DEFAULT NULL,
user_id INT UNSIGNED DEFAULT NULL,
comment VARCHAR(255) DEFAULT NULL,
created DATETIME DEFAULT NULL
)
Modelは次のように設定します。ここで重要なのはImgFile.phpの中の"
public $belongsTo = 'User';"です。これはテーブルimgfilesのあるフィールドがテーブルusersのidに依存していることを意味していて、そのフィールドはデフォルトでクラス名_idで、今回の場合user_idのフィールドとなります。また、usersのidはユニークでなければなりません。
User.php
<?php
App::uses('AppModel', 'Model');
class User extends AppModel {
public $name = 'User';
public $validate = Array(
:
);
public function beforeSave($options = array() ) {
:
}
}
ImgFile.php
<?php
App::uses('AppModel', 'Model');
class ImgFile extends AppModel {
public $name = 'ImgFile';
public $belongsTo = 'User';
public $validate = array(
:
);
}
ImgFilesController.php
Controllerでの$paginateの設定は以下のようになっています。fieldsで読取るフィールドを設定していますが'User.name'とusersテーブルフィールド名に対してクラス名Userを付けるのミソです。
public $paginate = array ('ImgFile' =>
array(
'fields' => array('filepath', 'user_id', 'comment','created','User.name'),
'limit' => 10,
'order' => array('ImgFile.created' => 'desc'),
)
);
使用する場合は通常通り以下のようにしてデータを取得します。
$conditions = null;
$this->set('filelist', $this->paginate($conditions));
display.ctp
Viewで読取ったデータを表示する場合、以下のようにクラス別にデータを取り出します。
<?php
foreach ($filelist as $file){
echo '<img width="600" alt="" border="1" src="';
echo Configure::read('myurl');
echo 'img/' . $file['ImgFile']['filepath'] .'"><br>';
echo '<a>' . $file['ImgFile']['created'] . '</a> : <a>' . h($file['User']['name']) . '</a><br>';
echo '<a>' . h($file['ImgFile']['comment']) . '</a><br><br>';
}
?>
因みにh()関数はCakePHPのエスケープ処理をする関数でこの中でhtmlspecialchars()を実行しています。