gpt4 book ai didi

zend-framework - 富域模型中的分页

转载 作者:行者123 更新时间:2023-12-04 06:40:42 28 4
gpt4 key购买 nike

我在我的应用中使用丰富的域模型。基本思路被采纳了there .例如,我有 User 和 Comment 实体。它们的定义如下:

<?php
class Model_User extends Model_Abstract {

public function getComments() {
/**
* @var Model_Mapper_Db_Comment
*/
$mapper = $this->getMapper();
$commentsBlob = $mapper->getUserComments($this->getId());
return new Model_Collection_Comments($commentsBlob);
}

}

class Model_Mapper_Db_Comment extends Model_Mapper_Db_Abstract {

const TABLE_NAME = 'comments';

protected $_mapperTableName = self::TABLE_NAME;

public function getUserComments($user_id) {
$commentsBlob = $this->_getTable()->fetchAllByUserId((int)$user_id);
return $commentsBlob->toArray();
}
}

class Model_Comment extends Model_Abstract {

}
?>

Mapper 的 getUserComments 函数只返回如下内容:

return $this->getTable->fetchAllByUserId($user_id)

这是数组。 fetchAllByUserId 接受 $count 和 $offset 参数,但我不知道如何在不重写所有模型代码的情况下通过模型将它们从我的 Controller 传递到此函数。

所以问题是如何通过模型数据 (getComments) 组织分页。是否有一种“漂亮”的方法来获取 5 到 10 条评论,而不是全部,因为 getComments 默认返回。

最佳答案

如果您只关心对用户看到的结果进行分页,而不关心提高性能,则可以避免将分页构建到您的模型基础结构中。

假设您有某种类型的 Model_Collection_Abstract 类,您的所有集合类都来自该类,您可能会在其中破解分页。

那么你的代码看起来像这样:

<?PHP
//$comments is a subclass of Model_Collection_Abstract, which implements the paging stuff
$comments = $user->getComments();
$comments->setStart(10);
$comments->setPageLength(10);

$numPages = $comments->numPages(); //can be derived from the pagelength and the collection's internal record store.

$currentPage = $comments->currentPage(); //can be derived from start and page length

foreach($comments as $comment){
//this code runs up to ten times, starting at the tenth element in the collection.
}

这里的缺点是您总是会捕获所有评论,即使您只想看到其中的 10 个。但这可能是您可以接受的解决方案。

如果您只想从数据库中提取 N 条记录(用于显示 N=number),那么您当然需要实现某种方式来传递开始/限制或等效参数,一直向下传递到您的模型。

编辑: 关于查看 Zend_Paginator 的另一个答案也值得一读。如果您的集合类实现了 Iterator,您很可能可以将它插入 Zend_Paginator 并避免一些严重的麻烦。我还没有这样做,但值得一看!

关于zend-framework - 富域模型中的分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2883900/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com