我试图在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()
......任何想法为什么?
答案 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
中的许多属性都是只读的。有两种简单的方法可以确定属性是否为只读。
canSetProperty()
set
前缀的方法,例如setLimit()
另一方面,您必须对查询设置限制,而不是分页。
答案 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定义的属性有几个特殊规则和限制:
此类属性的名称不区分大小写。例如,$object->label
和$object->Label
是相同的。这是因为PHP中的方法名称不区分大小写。
如果此类属性的名称与类成员变量相同,则后者优先。例如,如果上面的Foo类具有成员变量标签,那么赋值$object->label = 'abc'
将影响该行不会调用'label';
setter方法的成员变量setLabel()
。
这些属性不支持可见性。如果定义的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,
]);
希望这能帮助我的其他人!