web-dev-qa-db-ja.com

ActiveDataProviderでLIMITが機能していません

こんにちはみんな私は次のコードを使用していますが、limitは機能しませんが、コマンドが表示される場合は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

私がここでやっているのは何が悪いのですか?

15
Mike Ross

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,
]); 
25
arogachev

ActiveDataProviderでLimitを使用し、次のようにPaginationを保持できます:-

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

これにより、$this->getTotalCount() = 1000が作成され、ページネーションが維持されます。詳細については、 ここ および ここ に移動してください。

3
Eddie