Yii2 限制在ActiveDataProvider中不起作用

Yii2 限制在ActiveDataProvider中不起作用,yii2,yii2-advanced-app,yii2-basic-app,Yii2,Yii2 Advanced App,Yii2 Basic App,我正在使用以下代码,而限制不起作用。但是如果我看到命令,它会显示limit,但是当我将查询传递到ActiveDataProvider时,它会获取所有记录: $data= User::find()->where(['category_id'=> 5])->orderBy(['rand()' => SORT_DESC])->limit(4); $command = $data->createCommand(); $data2 = $comman

我正在使用以下代码,而
限制
不起作用。但是如果我看到命令,它会显示
limit
,但是当我将查询传递到
ActiveDataProvider
时,它会获取所有记录:

$data= User::find()->where(['category_id'=> 5])->orderBy(['rand()' => SORT_DESC])->limit(4);

    $command = $data->createCommand();

    $data2 = $command->queryAll();// This works fine and fetch only 4 data 

    $dataProvider = new ActiveDataProvider([
        'query' => $data,

    ]); // But this displays all data without limit

我在这里做错了什么?

以下是在
yii\data\ActiveDataProvider
中准备模型时发生的情况:

/**
 * @inheritdoc
 */
protected function prepareModels()
{
    if (!$this->query instanceof QueryInterface) {
        throw new InvalidConfigException('The "query" property must be an instance of a class that implements the QueryInterface e.g. yii\db\Query or its subclasses.');
    }
    $query = clone $this->query;
    if (($pagination = $this->getPagination()) !== false) {
        $pagination->totalCount = $this->getTotalCount();
        $query->limit($pagination->getLimit())->offset($pagination->getOffset());
    }
    if (($sort = $this->getSort()) !== false) {
        $query->addOrderBy($sort->getOrders());
    }

    return $query->all($this->db);
}
我们对这一部分感兴趣:

if (($pagination = $this->getPagination()) !== false) {
    $pagination->totalCount = $this->getTotalCount();
    $query->limit($pagination->getLimit())->offset($pagination->getOffset());
}
因此,您可以看到,如果分页不是
false
,则会自动管理限制

您只需将分页设置为
false
,然后手动设置限制即可:

$dataProvider = new ActiveDataProvider([
    'query' => $query,
    'pagination' => false,
]); 

您可以在ActiveDataProvider中使用Limit并保持分页,如下所示:-

$dataProvider = new ActiveDataProvider([
        'query' => $query,
         'pagination' => [
             'pageSize' => 50, 
         ],
    ]);
$dataProvider->setTotalCount(1000);
这将使
$This->getTotalCount()=1000
并保持分页。 去看看更多的参考资料