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

时间:2014-11-05 11:06:47

标签: php pagination yii2

我试图在Yii2中将我的活动数据提供者的限制设置为5个记录。根据{{​​3}}文档,$ 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,
        ],
    ]);

我的问题是:为什么会这样? pageSize如果我删除了limit一切顺利...... 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() ......任何想法为什么?

4 个答案:

答案 0 :(得分:2)

分页没有属性$ 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,
    ],
]);

答案 1 :(得分:0)

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

  1. 使用canSetProperty()
  2. 如果有set前缀的方法,例如setLimit()
  3. 另一方面,您必须对查询设置限制,而不是分页。

答案 2 :(得分:0)

也许ArrayDataProvider会更适合。

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

答案 3 :(得分:-1)

根据Yii Guid Concept of Properties

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

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

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

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

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

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

  5. 所以换句话说,没有办法只用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,
    ]);
    

    希望这能帮助我的其他人!