让我解释一下我的问题,希望你知道它是什么。
我有一个隐藏公共访问的Web服务,并设计了一种安全的mysql sql查询方式,用于跨网站的服务。所以我不认为我真的可以使用Yii2的当前模型层,这也意味着我几乎不能使用activeDataProvider
作为没有数据库存在。
目前我所做的是编写原始sqls并获取所有结果,然后使用ArrayDataProvider
将数据输入到dataprovider中。
e.g。
$sql="select * from a_table";
$result=$remote->select($sql);
$dataProvider = new ArrayDataProvider([
'allModels' => $result,
'sort' => [
'attributes' => ['date', 'name'],
],
'pagination' => [
'pageSize' => 10,
],
]);
return $this->render('index', [
'dataProvider' => $dataProvider,
]);
这会造成问题,每次我需要查询整个表格。如果表非常大,这不是主意。最好以10个大小查询,但是如果我这样做
$sql="select * from a_table LIMIT 10";
在我的案例中不会出现分页......我如何解决这个问题?如果这不是与外部数据服务交谈的想法,那么你的建议是什么?
答案 0 :(得分:0)
分页不会出现,因为您只向ArrayDataProvider提供了10行,并且无法知道还有更多行。
如果您希望DataProvider
使用远程抓取,我建议您通过扩展MyRemoteDataProvider
并至少覆盖这四种方法来创建自己的BaseDataProvider
类:
use yii\data\BaseDataProvider;
class MyRemoteDataProvider extends BaseDataProvider
{
protected function prepareModels()
{
}
protected function prepareKeys($models)
{
}
protected function prepareTotalCount()
{
}
protected function sortModels($models, $sort)
{
}
}
..然后当然使用您的MyRemoteDataProvider
代替ArrayDataProvider
。如果您不知道应该返回哪些方法,请阅读BaseDataProvider的文档或受ArrayDataProvider实施的启发。