我正在尝试将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
,pageSize
就会工作,一切都会顺利。。。在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
中的许多属性都是只读的。有两种简单的方法可以确定属性是否为只读。
- 使用
canSetProperty()
- 如果存在前缀为
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定义的属性有几个特殊的规则和限制:
-
此类属性的名称不区分大小写。例如,
$object->label
和$object->Label
是相同的。这是因为PHP中的方法名称不区分大小写。 -
如果此类属性的名称与类成员变量相同,则后者将优先。例如,如果上面的Foo类有一个成员变量标签,那么赋值
$object->label = 'abc'
将影响该行不会调用setLabel()
setter方法的成员变量'label';
。 -
这些属性不支持可见性。如果定义getter或setter方法是public、protected或private,则对属性的可见性没有影响。
-
属性只能由非静态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,
]);
希望这能帮助其他站在我立场上的人!