Yii间接修改重载属性

时间:2011-03-17 09:45:02

标签: php activerecord yii

$winnerBid = Bids::model()->find($criteria);

模型有下一个关系:

public function relations() {
        return array(
            'item' => array(self::BELONGS_TO, 'Goods', 'item_id'),
            'room' => array(self::BELONGS_TO, 'Rooms', 'room_id'),
            'seller' => array(self::BELONGS_TO, 'RoomPlayers', 'seller_id'),
            'buyer' => array(self::BELONGS_TO, 'RoomPlayers', 'buyer_id'),
        );
    }

当我想保存时:

 $this->seller->current_item++;
    $this->seller->wins++;
    $this->seller->save();

我收到错误:

  

间接修改过载   属性出价:: $卖家没有效果   (/var/www/auction/www/protected/models/Bids.php:16)

但是在另一台服务器上一切都很好吗? 怎么解决?或者覆盖php指令?有任何想法吗? TNX

2 个答案:

答案 0 :(得分:17)

这里的问题是$seller不是“真正的”属性(Yii通过使用魔术__get方法在其模型上实现属性),所以实际上你试图修改返回值一个函数(没有效果)。就像你试图做的那样:

function foo() {
    return 42;
}

// INVALID CODE FOR ILLUSTRATION
(foo())++;

我不确定这种行为在不同PHP版本上的状态,但是您可以使用一种简单的解决方法:

$seller = $this->seller;
$seller->current_item++;
$seller->wins++;
$seller->save();

答案 1 :(得分:2)

在尝试使用CActiveRecord属性属性大规模操作属性时,我还收到错误消息“Yii间接修改重载属性”

然后,我发现了另一种方法来克服这个问题,在魔术方法与包含数组的对象变量相关的情况下看一下:你创建一个AUXILIARY ARRAY,你可以在其中放置原始值和新值(有时候想要替换与其中一个键相关的值,这些方法并不令人满意)。并且AFTERWARDS使用分配,其作用类似于参考。例如:

$auxiliary_array = array();
foreach(Object->array_built_with_magic as $key=>$value) {
     if(….) {
      $auxiliary_array[$key] = Object->array_built_with_magic[$key];
      } else if (…) {
      $auxiliary_array[$key] = $NEW_VALUE
      }
}
//So now we have the array $auxiliary_array with the
// desired MIX (that is, some originals, some modifications)
//So we will do now:
Object->array_built_with_magic =$auxiliary_array;