Свежайшие Пирожки от CakePHP по-русски

Полнейшее руководство CakePHP 1.2 на русском языке, горячие новости и полезные статьи

Начнем с примера

У нас есть следующие модели:

Tag HABTM Article
Article HABTM Tag
Article hasMany Comment
… и обе модели Article и Comment belongsTo User

Сперва созадим форму (view add.ctp), теперь мы можем сохранить Статью(Article) с некоторыми Тегами(Tags) и соответствующими Коментариями(Comment), все модели зависят от модели User. Это все будет очень легко, благодаря любимой функции saveAll()

<?php
    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 код:

START TRANSACTION
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

Довольно мощный материал, причем лишь несколько строк кода.


Оригинал статьи: http://teknoid.wordpress.com/2009/03/30/revisitng-saveall-and-habtm/


Все статьи о CakePHP