yii2正在设置只读属性:yiidataPagination::limit


yii2 Setting read-only property: yiidataPagination::limit

我正在尝试将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,
        ],
    ]);

我的问题是:为什么会发生这种情况?如果我擦除limitpageSize就会工作,一切都会顺利。。。在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()。。。有什么想法吗?

分页没有属性$limit,

@property integer$limit数据的限制。这可以用于设置SQL语句的LIMIT值

由propery$pageSize设置的值。

如果你需要获得最后5条新闻,这必须与寻呼机一起工作,你需要这样的东西:

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

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

  1. 使用canSetProperty()
  2. 如果存在前缀为set的方法,例如setLimit()

另一方面,您必须对查询设置限制,而不是分页。

也许ArrayDataProvider更适合。

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

根据Yii-Guid属性概念

由不带setter的getter定义的属性是只读的。尝试将值分配给此类属性将导致InvalidCallException。类似地,由不带getter的setter定义的属性是只读的,尝试读取此类属性也会导致异常。只写属性并不常见。

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

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

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

  3. 这些属性不支持可见性。如果定义getter或setter方法是public、protected或private,则对属性的可见性没有影响。

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

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

$limit public read-only property

integer getLimit( )

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

为了使其按预期工作,代码需要变成这样:

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

希望这能帮助其他站在我立场上的人!

相关文章:
  • 没有找到相关文章