LIMIT is not working in ActiveDataProvider

13,593

Solution 1

Here is what happens when preparing models in 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);
}

We're interested in this part:

if (($pagination = $this->getPagination()) !== false) {
    $pagination->totalCount = $this->getTotalCount();
    $query->limit($pagination->getLimit())->offset($pagination->getOffset());
}

So as you can see if pagination is not false, limit is managed automatically.

You can just set pagination to false and then manual setting of limit will work:

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

Solution 2

You can use Limit in the ActiveDataProvider and keep Pagination like so:-

$dataProvider = new ActiveDataProvider([
        'query' => $query,
         'pagination' => [
             'pageSize' => 50, 
         ],
    ]);
$dataProvider->setTotalCount(1000);

This will make $this->getTotalCount() = 1000 and Keep the pagination. Go here and here for more reference.

Share:
13,593
Mike Ross
Author by

Mike Ross

Software Developer and Business Owner in Sydney

Updated on June 17, 2022

Comments

  • Mike Ross
    Mike Ross almost 2 years

    I am using following code and the limit doesnt work. But if I see the command than it shows limit in that, but when I pass the query to ActiveDataProvider it fetch all the records:

    $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
    

    What is wrong I am doing here?