findの引数にLEFT JOINを指定して複数テーブルの紐付けを
したときのメモ。
userテーブルのfruitカラム「Orange」を
commentsテーブルのnameカラム「Orange」と
紐付けて取得。
■usersテーブルの作成
--
-- テーブルの構造 `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL,
`created` date NOT NULL,
`modified` date NOT NULL,
`name` varchar(11) NOT NULL,
`fruit` varchar(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- テーブルのデータをダンプしています `users`
--
INSERT INTO `users` (`id`, `created`, `modified`, `name`, `fruit`) VALUES
(1, '2010-07-19', '2010-07-19', 'Tarou', 'Orange');
■commentsテーブルの作成
--
-- テーブルの構造 `comments`
--
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(11) NOT NULL,
`created` date NOT NULL,
`modified` date NOT NULL,
`user_id` int(11) NOT NULL,
`status` int(11) NOT NULL,
`name` varchar(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- テーブルのデータをダンプしています `comments`
--
INSERT INTO `comments` (`id`, `created`, `modified`, `user_id`, `status`, `name`) VALUES
(1, '2010-07-19', '2010-07-19', 1, 1, 'Orange'),
(2, '2010-07-18', '2010-07-18', 1, 2, 'Apple'),
(3, '2010-07-20', '2010-07-20', 2, 1, 'Orange');
■users.phpモデルの作成
class User extends AppModel {
var $name = 'User';
}
?>
■comments.phpモデルの作成
class Comment extends AppModel {
var $name = 'Comment';
}
?>
■users_controller.phpコントローラの作成
※コメントアウトは自分のメモ用にわざとつけてあります。
class UsersController extends AppController {
var $name = 'Users';
var $uses = array('User','Comment');
function index() {
$options['joins'] = array(
array(
//'table' => 'comments',
//'alias' => 'Comment',
'table' => 'users',
'alias' => 'User',
'type' => 'LEFT',
'conditions' => array(
//'User.id = Comment.user_id',
'User.fruit = Comment.name',
)
)
);
$options['conditions'] = array(
//'Comment.user_id' => 1
//'User.id' => 1
'User.fruit' => 'Orange'
);
//$this->set('users', $this->User->find('all', $options));
$this->set('users', $this->Comment->find('all', $options));
}
}
?>
■users/index.ctpビューの作成
var_dump($users); ?>
findの引数にfieldsやorder, limitを
配列で定義するのと同様にjoinsを
定義すればOK。