Phalcon分页调用getItems()返回NativeArray 如何获取Model实例
解决方法
1. 替换分页适配器为QueryBuilder
你当前使用的Phalcon\Paginator\Adapter\NativeArray本身是针对数组数据源设计的,无论传入的数组是不是从Model查询来的,最终返回的分页条目都会是数组格式,无法保留Model实例。
你需要改用ORM的查询构造器作为数据源,搭配Phalcon\Paginator\Adapter\QueryBuilder适配器实现分页,示例代码如下:
// 首先构造查询你所需Model的QueryBuilder $builder = $this->modelsManager->createBuilder() ->columns('*') ->from(YourModel::class) // 可按需添加where、join等关联查询条件,和普通ORM查询用法一致 ->where('status = :status:', ['status' => 1]); // 初始化QueryBuilder分页适配器 $paginator = new \Phalcon\Paginator\Adapter\QueryBuilder([ 'builder' => $builder, 'limit' => 10, // 每页条数 'page' => $this->request->getQuery('page', 'int', 1), // 当前页码 ]); // 获取分页结果 $paginate = $paginator->paginate(); $items = $paginate->getItems();
此时$items遍历出来的每个元素都是YourModel的实例,可以直接调用关联模型的方法,比如$item->getRelated('otherModel')。
以上用法适配Phalcon 3.x、4.x主流版本,5.x版本分页适配器命名空间略有调整,但核心的QueryBuilder分页逻辑完全一致。
2. 特殊情况处理:如果必须使用数组数据源
如果你的业务场景必须先拿到Model数组再做分页,可以手动把NativeArray返回的数组重新还原为Model实例,示例如下:
$items = $paginator->paginate()->getItems(); $modelItems = []; foreach ($items as $item) { $model = new YourModel(); // 把数组数据赋值到Model实例,跳过数据校验避免报错 $model->assign($item, [], false); $modelItems[] = $model; }
注意:该方法会额外遍历一次结果集,性能不如直接用QueryBuilder适配器,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者Soner B
相关产品推荐
相关产品推荐

