例 18-2 - 在循环中获得相关类的详细信息
// 在动作中
$this->articles = ArticlePeer::doSelect(new Criteria());
// 通过 doSelect()发出的数据库查询
SELECT article.id, article.title, article.author_id, ...
FROM article
// 在模板中
<ul>
<?php foreach ($articles as $article): ?>
<li><?php echo $article->getTitle() ?>,
written by <?php echo $article->getAuthor()->getName() ?></li>
<?php endforeach; ?>
</ul>
如果$articles 数组包含了十个对象,那么当类 Author 的对象调用化合
(hydrate)的时候会依次执行十次 getAuthor()方法,如例 18-3 所示。
例 18-3 - 外键获取方法发出了一个数据库查询
// 在模板中
$article->getAuthor()
// getAuthor()发出的数据库查询
SELECT author.id, author.name, ...
FROM author
WHERE author.id = ? // ? 是 article.author_id
所以例 18-2 中的翻页总共需执行 11 条查询语句: 其中一个当然是用来建立
Article 对象的,其余的 10 条查询语句是用来逐次建立 Author 对象。仅仅显示
文章和他们的作者列表却需用多条查询语句来完成。
如果只是使用简单的 SQL 语句,你应该知道如何减少查询语句,只用一条语句
来获得 article 表和相关 author 表的内容。这就是 ArticlePeer 类的
doSelectJoinAuthor()方法做的事情。它提供了比单纯 doSelect()调用更复杂
的查询语句,但在结果集中增加了列,设置允许 Propel 来融合 Article 对象和
相关的 Author 对象。例 18-4 中的代码展示了和例 18-2 同样的效果,但是只需
要一条数据库查询语句而不是以前的 11 条语句来处理,这会处理的更快。
例 18-4 - 在一条语句中获得文章详细资料和他们的作者