- 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')操作所返回的结果非常类似。