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

在多对多关系中检索相关模型数据

跟一对一以及一对多关系一样,一旦模型关联定义好了,CakePHP就会自动调取多对多关系中相关模型的数据。

动手时间:检索相关模型的数据

1,将Author控制器(文件位置:/app/controllers/authors_controller.php)和Books控制器(文 件位置:/app/controllers/books_controller.php)中的脚手架功能移除。

2,在Authors控制器中添加index操作,代码如下:

    <?php
    class AuthorsController extends AppController {
       var $name = 'Authors';    
       function index() {
          $this->Author->recursive = 1;
          $authors = $this->Author->find('all');
          $this->set('authors', $authors);
       }
    }
    ?>
    Create a view file for the /authors/index action (/app/views/authors/index.ctp):
    <?php foreach($authors as $author): ?>
    <h2><?php echo $author['Author']['name'] ?></h2>
    <hr />
    <h3>Book(s):</h3>
    <ul>
    <?php foreach($author['Book'] as $book): ?>
    <li><?php echo $book['title'] ?></li>
    <?php endforeach; ?>
    </ul>
    <?php endforeach; ?>

3,在Books控制器中添加如下代码:

    <?php
    class BooksController extends AppController {
       var $name = 'Books';    
       function index() {
          $this->Book->recursive = 1;
          $books = $this->Book->find('all');
          $this->set('books', $books);
       }
    }
    ?>

4,为/books/index创建一个视图文件(文件位置:/app/views/books/ index.ctp)

    <?php foreach($books as $book): ?>
    <h2><?php echo $book['Book']['title'] ?></h2>
    <hr />
    <h3>Author(s):</h3>
    <ul>
    <?php foreach($book['Author'] as $author): ?>
    <li><?php echo $author['name'] ?></li>
    <?php endforeach; ?>
    </ul>
    <?php endforeach; ?>

5,现在访问下面这两个链接:

http://localhost/relationship/authors/

http://localhost/relationship/books/v

怎么回事?

在这两模型中,我们将递归属性 $recursive的值设置为1,然后我们调用了各自模型的find('all')函数。find('all')查找操作返回所有与该模型直接相关的模 型数据。find('all') 操作返回的结果被传送给了对应的视图文件,在视图文件中,我们对结果进行遍历,然后将模型以及与它们的相关数据显示出来。

在Books控制器中,我们从 find('all')查询操作返回而来的数据被保存在了$books变量中。find(‘all’)返回了一个图书信息的数组,每个数组元素都包含该图 书以及相关作者的信息。

Array
 (
        [0] => Array
        (
             [Book] => Array
           (
              [id] => 1
              [title] => Book Title
       ...
             )
           [Author] => Array
             (
                [0] => Array
              (
                 [id] => 1
                [name] => Author Name
                  ...
               )
              [1] => Array
              (
               [id] => 3
            ...   
)

对Author模型也是一样,返回的数据是一个作者信息的数组。每个数组元素又包含了两个数组:一个包含有作者的信息,另一个包含的是与该作者相关 的图书信息的数组。这些数组跟我们之前在一对多关联中使用find('all')操作所返回的结果非常类似。

填写登录信息
用户名
密码