在 Yii2 中更改查询限制

Change limit of queries in Yii2

我想用 Yii2 创建 searchModel,我的查询默认限制是 7,我在页面上有一个输入下拉列表,可以在 7 和 30 之间切换查询限制。

我该怎么做?

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($modelSearch, 'limit')->dropDownlist([
        7 => '7 days',
       30 => '30 days',
    ]); ?>
<?php ActiveForm::end(); ?>

这是模特

class SearchModel extend \yii\base\Models
{
    public $limit;
    public function search($params) {
        $query = Objects::find()->where(['attribute1'=>'a', 'attribute2'=>b]);
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => ['attributes' => ['attribute1', 'attribute2',]]
        ]);

        $this->load($params);
        return $dataProvider;
    }
}

这是控制器

public function actionIndex()
{
     $searchModel = new ModelSearch();
     $dataProvider = $searchModel->search(Yii::$app->request->post());
     return $this->render('index', [
         'searchModel' => $searchModel,
         'dataProvider' => $dataProvider,
     ]);
}

我试过添加

if(empty($params['limit'])) {
         $query->limit(7);
     }else {
         $query->limit($params['limit']);
     }

进入模型 - 它有效,但我认为这不是解决它的明智方法。

您可以像这样定义 SearchModel:

<?php

namespace app\models\search;

use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\models\Human;

/**
 * Class HumanSearch
 *
 * @package app\models\search
 */
class HumanSearch extends Model
{
    /**
     * @var int $limit
     */
    public $limit;

    /**
     * @return array
     */
    public function rules(): array
    {
        return [
            [['limit'], 'integer', 'min' => 7, 'max' => 30], // Limit can be between 7 and 30.
            [['limit'], 'default', 'value' => 7], // Default query limit is 7 rows.
        ];
    }

    /**
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search(array $params): ActiveDataProvider
    {
        // Initialize query.
        $query = Human::find();
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        // Load additional params to search model.
        if (!$this->load($params) && $this->validate()) {
            return $dataProvider;
        }

        // Set query limit.
        $query->limit($this->limit);

        return  $dataProvider;
    }
}

然后在actionIndex()中使用Controller:

<?php

namespace app\controllers;

use Yii;
use yii\rest\Controller;
use yii\data\ActiveDataProvider;
use app\models\search\HumanSearch;

class HumanController extends Controller
{
    public function actionIndex(): ActiveDataProvider
    {
        $params = Yii::$app->getRequest()->getQueryParams();
        $search = new HumanSearch;

        return $search->search($params);
    }
}