【问题标题】:yii2 Setting read-only property: yii\data\Pagination::limityii2 设置只读属性:yii\data\Pagination::limit
【发布时间】:2014-11-06 02:17:24
【问题描述】:

我正在尝试将 Yii2 中的活动数据提供者的分页限制设置为 5 条记录。根据THIS 文档, $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()...任何想法为什么?

【问题讨论】:

  • 你想达到什么目的? pageSize 将决定每页显示多少行。
  • @Alex 我试图只显示我的数据库中的最后 5 条记录。我看到了文档,我认为我在分页中有可用的 limit 属性,但事实证明,我没有......检查我的答案
  • 我对这个问题投了反对票:1) 从代码中可以清楚地看出 getLimit 是 getPageSize 方法的别名,用于 SQL 数据检索(例如 MySQL 中没有 pageSize ,但是有一个限制)。 2) 设置只读属性的原因是什么?作者明确设置这是只读的,您不应该手动设置它。 3)“使用源卢克”——只需打开源代码并在代码中找到答案,而不是问愚蠢的问题“为什么我不能设置只读属性”。

标签: php pagination yii2


【解决方案1】:

分页没有属性$limit,

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

由属性 $pageSize 设置的值。

如果您需要获取最近 5 条新闻并且这必须与寻呼机一起使用,您需要这样的东西:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,但是我想通过分页设置它,原因有两个:一个是因为我可以,所以为什么不可以,二是因为 php 脚本运行速度比查询快
    • @AresDraguna :)) 所以我建议您至少在将加载此数据提供程序的小部件中使用限制。无论如何,你不能这样做
    【解决方案3】:

    也许ArrayDataProvider 会更合适。

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

    【讨论】:

    • 这也适用于 ActiveDataProvider,正如我的回答所示:) 它与此无关......我只是想知道我是否可以在分页中使用 limit 属性以及为什么该属性是只读
    【解决方案4】:

    据Yii Guid Concept of Properties

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

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

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

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

    3. 这些属性不支持可见性。如果定义的 getter 或 setter 方法是公共的、受保护的或私有的,这对属性的可见性没有影响。

    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,
    ]);
    

    希望这可以帮助我的其他人!

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      相关资源
      最近更新 更多