CArrayDataProvider 实现有点不太实用啊

里面 fetchData 返回数据的时候是用 return array_slice($this->rawData, $pagination->getOffset(), $pagination->getLimit());

而CPagination中没有 setOffset 的方法,就是说这个rawData必须是取所有符合条件的数据。

数据库中有上千万条的数据,为了考虑效率使用的是 DAO 方式查询,这样就要取这么多数据送给CArrayDatapRrovider?

你们有没有什么好的方法?一定要扩展CArrayDataProvider 或 CPagination 吗?

用CSqlArrayDataProvider也不错,DAO与AR效果差不多呢,只要你的索引优化好,

还有另一个方法就是让把你的sql写成视图,然后创建这个视图的model,当然这个model只能读不能写的,这样也不错!而且不用扩展任何widget。

DAO与AR效果差太多

CArrayDataProvider 确实是取所有记录,这个是不是性能有点问题?

一次取出几万条数据就会很慢了,影响性能,这个东西应该重写

CSqlDataProvider 帮你忙, :lol:

这个问题。应该是关于分页的问题。。。yii的分页。。就是在每次都获取一次所有数据。。然后再截取相应的数据。返回

无论是CSqlDataProvider还是用ar。。

你可以把分页的数据进行缓存。然后每次就不用请求数据库了。。这是个折中的办法。。但是不能解决根本问题。。除非重写yii的分页和dataprovider