Начнем с примера
У нас есть следующие модели:
Tag HABTM Article
Article HABTM Tag
Article hasMany Comment
… и обе модели Article и Comment belongsTo User
Сперва созадим форму (view add.ctp), теперь мы можем сохранить Статью(Article) с некоторыми Тегами(Tags) и соответствующими Коментариями(Comment), все модели зависят от модели User. Это все будет очень легко, благодаря любимой функции saveAll()
echo $form->create();
echo $form->input('Article.title');
echo $form->input('Article.body');
echo $form->hidden('Article.user_id', array('value' => $session->read('User.id')));
echo $form->input('Tag', array('options'=>array(15,20,30), 'multiple'=>'checkbox'));
echo $form->input('Comment.comment');
echo $form->hidden('Comment.user_id', array('value' => $session->read('User.id')));
echo $form->end('Add Aricle with Tags and Comment');
?>
Довольно простая форма. Я вычитаю значение User.id из некоторой переменной, которая до этого была сохранения в сессии (вы также можете изменить массив данных в контроллере перед сохранением, нежели устанавливать это значение в скрытом поле). Также, я создал “поддельный” массив id Тегов в 'options'=>array(15,20,30)… в реальных случаях данные могут подтягваться с $this->Article->Tag->find('list');
После отправки формы, метод контроллера для сохранения данных save all очень короткий и довольно простой:
function add() {
if(!empty($this->data)) {
$this->Article->saveAll($this->data);
}
}
?>
Ради интереса, вот результирующий SQL код:
INSERT INTO `articles` (`body`, `user_id`, `updated`, `created`) VALUES ('This is a great article with tags and comments', 5, '2009-03-30 11:54:54', '2009-03-30 11:54:54')
SELECT LAST_INSERT_ID() AS insertID
SELECT `ArticlesTag`.`tag_id` FROM `articles_tags` AS `ArticlesTag` WHERE `ArticlesTag`.`article_id` = 6
INSERT INTO `articles_tags` (`article_id`,`tag_id`) VALUES (6,'0'), (6,'1'), (6,'2')
INSERT INTO `comments` (`comment`, `user_id`) VALUES ('NO comment', 6)
SELECT LAST_INSERT_ID() AS insertID
COMMIT
Довольно мощный материал, причем лишь несколько строк кода.


Коментарии:
Пока нетуДобавить коментарий