— 文章所属小组: CakePHP
CakePHP应用开发 第六章 对象关系映射:构建表关系 (9)
  • Moon.Wong
  • 评论(0)

在多对多关系中保存相关模型数据

跟简单的关系一样,在多对多关系中保存相关数据也是非常容易的,我们接下来会修改之前的代码,添加新功能,让用户在保存图书信息的同时保存图书的多 个作者的信息。

动手时间:保存相关模型数据

1,在Books控制器(文件位置:/app/controllers/books_controller.php)中添加一个新操作add()
    <?php
    class BooksController extends AppController {
       var $name = 'Books';
       var $helpers = array( 'Form' );    
       function index() {
          $this->Book->recursive = 1;
          $books = $this->Book->find('all');
          $this->set('books', $books);
       }    
       function add() {
          if (!empty($this->data)) {
             $this->Book->create();
             $this->Book->save($this->data);
             $this->redirect(array('action'=>'index'), null, true);
          }
          $authors = $this->Book->Author->generateList();
          $this->set('authors', $authors);
       }
    }
    ?>

2,为/books/add/操作创建一个带有信息录入表单的视图(/app/views/books/add.ctp)
    <?php echo $form->create('Book');?>
       <fieldset>
           <legend>Add New Book</legend>
       <?php
          echo $form->input('isbn');
          echo $form->input('title');
          echo $form->input('description');
          echo $form->input('Author');
   ?>
   </fieldset>

3,使用浏览器访问下列地址,并添加图书信息。
http://localhost/relationship/books/add

怎么回事?

Author模型的generateList() 函数是用来获取所有作者列表的。在这个表单中,我们也创建了一个选择列表以接受所有相关作者名字——我们可以从这个列表中选取多个作者。

这段代码$form->input('Author')具体负责自动生成选择列表,在表单助手(form helper)的input方法中,相关的模型名称Author是作为参数提供的。它告诉该方法使用$authors数组来创建多选列表。

当表单提交时,Book模型的Save函数在获取图书信息的同时也会获取所有相关作者的信息。Save函数首先保存图书的信息,然后在联接表中创建 记录以构建该图书和多个作者之间的对应关系。

填写登录信息
用户名
密码