让我解释一下我的问题,希望你能了解它是什么。
我有一个隐藏公共访问的 Web 服务,并设计了一种安全的 mysql sql 查询方式,用于跨网站的服务。 所以我认为我不能真正使用 Yii2 的当前模型层,这也意味着我几乎不能使用 activeDataProvider
因为没有数据库存在。
目前我所做的是编写原始sqls并获取所有结果,然后使用ArrayDataProvider
输入数据提供者。
例如
$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";
在我的情况下不会出现分页...如何解决此问题?如果这不是与外部数据服务对话的想法方式,您的建议是什么?
分
页不会出现,因为您只向 ArrayDataProvider 提供 10 行,并且它无法知道还有更多。
如果您想将DataProvider
与远程获取一起使用,我建议您通过扩展BaseDataProvider
并至少覆盖以下四种方法来创建自己的MyRemoteDataProvider
类:
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 实现中获得灵感。