Php yii2设置只读属性:yii\data\Pagination::limit

Php yii2设置只读属性:yii\data\Pagination::limit,php,pagination,yii2,Php,Pagination,Yii2,我正在尝试将分页中Yii2中的活动数据提供程序限制为5条记录。根据文档,$limit属性是可用的,但我得到了以下错误: Setting read-only property: yii\data\Pagination::limit 我的代码是: $dataProvider = new ActiveDataProvider([ 'query' => Order::find() ->where(['user_id' => $user_

我正在尝试将分页中Yii2中的活动数据提供程序限制为5条记录。根据文档,$limit属性是可用的,但我得到了以下错误:

Setting read-only property: yii\data\Pagination::limit
我的代码是:

    $dataProvider = new ActiveDataProvider([
        'query' => Order::find()
            ->where(['user_id' => $user_id]),
        'sort' =>[
            'defaultOrder' => [
                'id' => SORT_DESC
            ]
        ],
        'pagination' => [
            'pageSize' => 20,
            'limit' => 5,
        ],
    ]);
我的问题是:为什么会发生这种情况?如果我清除
限制
一切顺利,
页面大小
就可以工作了。。。在
limit
上,所有操作都失败。。。我怎样才能解决这个问题

L.E:我找到了抛出此错误的源方法,以防有帮助:

    /**
     * Sets value of an object property.
     *
     * Do not call this method directly as it is a PHP magic method that
     * will be implicitly called when executing `$object->property = $value;`.
     * @param string $name the property name or the event name
     * @param mixed $value the property value
     * @throws UnknownPropertyException if the property is not defined
     * @throws InvalidCallException if the property is read-only
     * @see __get()
     */
    public function __set($name, $value)
    {
        $setter = 'set' . $name;
        if (method_exists($this, $setter)) {
            $this->$setter($value);
        } elseif (method_exists($this, 'get' . $name)) {
            throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
        } else {
            throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
        }
    }

根据这一点,我试图:
getLimit()
而不是
setLimit()
。。。知道为什么吗?

Yii中的许多属性都是只读的。有两种简单的方法可以确定属性是否为只读

  • 使用
    canSetProperty()
  • 如果存在前缀为
    set
    的方法,例如
    setLimit()
  • 另一方面,您必须对查询设置限制,而不是分页。

    根据Yii

    由没有setter的getter定义的属性是只读的。尝试为此类属性赋值将导致错误。类似地,由没有getter的setter定义的属性是只读的,尝试读取此类属性也会导致异常。只有写属性并不常见

    对于通过getter和setter定义的属性,有几个特殊规则和限制:

  • 此类属性的名称不区分大小写。例如,
    $object->label
    $object->label
    是相同的。这是因为PHP中的方法名不区分大小写

  • 如果此类属性的名称与类成员变量相同,则后者将优先。例如,如果上面的Foo类有一个成员变量标签,那么赋值
    $object->label='abc'
    将影响成员变量
    'label'
    该行不会调用
    setLabel()
    setter方法

  • 这些属性不支持可见性。如果定义getter或setter方法是public、protected或private,则属性的可见性没有区别

  • 属性只能由非静态getter和/或setter定义。静态方法将不会以相同的方式处理

  • 因此,换句话说,只有使用PHP是不可能做到这一点的。正如文档中所说,我刚才看到的一件事:

    $limit公共只读属性

    integer getLimit()

    数据的限制。这可用于设置用于获取当前数据页的SQL语句的限制值。请注意,如果页面大小为无限大,将返回值-1

    为了使其按预期工作,代码需要如下:

    $dataProvider = new ActiveDataProvider([
        'query' => Order::find()
            ->where(['user_id' => $user_id])
            ->limit(5),
        'sort' =>[
            'defaultOrder' => [
                'id' => SORT_DESC
            ]
        ],
        'pagination' => false,
    ]);
    
    希望这有助于别人在我的立场

    也许更合适

    $query = new Query;
    $provider = new ArrayDataProvider([
        'allModels' => $query->from('post')->limit(5)->all(),
        'key' => 'id',
        'sort' => [
            'defaultOrder' => [
                'id' => SORT_DESC
            ]
        ]
    ]);
    

    分页没有属性$limit

    @属性integer$限制数据的限制。这可用于设置SQL语句的限制值

    该值由propery$pageSize设置

    如果您需要获取最后5条新闻,并且必须使用寻呼机,则您需要以下内容:

    $dataProvider = new ActiveDataProvider([
        'query' => Order::find()
            ->where(['user_id' => $user_id]),
        'sort' =>[
            'defaultOrder' => [
                'id' => SORT_DESC
            ]
        ],
        'pagination' => [
            'pageSize' => 5,
        ],
    ]);
    

    是的,但我想通过分页来设置它,原因有两个:一个是因为我可以,所以为什么不呢,还有两个是因为php脚本的运行速度比a脚本快query@AresDraguna:))所以我建议您至少在将加载此数据提供程序的小部件中使用limit。无论如何,你不能这样做。你想达到什么目的
    pageSize
    将确定每页显示多少行。@Alex我试图只显示数据库中的最后5条记录。我看到了文档,我认为我在分页中有limit属性,但事实证明,我没有。。。检查我的回答我否决了这个问题:1)从代码中可以清楚地看出getLimit是getPageSize方法的别名,用于SQL数据检索(例如,MySQL中没有pageSize,但有一个限制)。2) 设置只读属性的原因是什么?作者明确设置为只读,您不应手动设置。3) “Use sources Luke”-只需打开源代码并在代码中找到答案,而不是问愚蠢的问题“为什么我不能设置只读属性”。这也适用于ActiveDataProvider,正如我的答案所示:)这与此无关。。。我只是想知道我是否可以在分页中使用limit属性,以及为什么该属性是只读的