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(); -  $this->seller->current_item++; $this->seller->wins++; $this->seller->save(); -  $this->seller->current_item++; $this->seller->wins++; $this->seller->save(); 

Я получаю ошибку:

Непрямая модификация перегруженного имущества. Ставки: $ продавец не имеет эффекта (/var/www/auction/www/protected/models/Bids.php:16)

Но на другом сервере все было хорошо? Как это исправить? Или переопределить директивы php? Есть идеи? TNX

Проблема здесь в том, что $seller не является «реальным» свойством (Yii реализует свойства на своих моделях с помощью магического метода __get ), поэтому вы пытаетесь изменить возвращаемое значение функции (которая не имеет никакого эффекта). Это как если бы вы пытались сделать:

 function foo() { return 42; } // INVALID CODE FOR ILLUSTRATION (foo())++; 

Я не уверен в статусе этого поведения на разных версиях PHP, но есть простой способ обхода:

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

У меня также было сообщение об ошибке «Yii Косвенная модификация перегруженного свойства» при попытке массированного манипулирования атрибутами с использованием свойства атрибутов CActiveRecord.

Затем я обнаружил еще один способ преодоления этой проблемы, в случае, когда магический метод связан с объектной переменной, которая содержит массив: вы создаете ВСПОМОГАТЕЛЬНЫЙ МАССИВ, в который вы помещаете оригинал и новые значения (иногда один хочет ЗАМЕНИТЬ значение, относящееся к одному из ключей, и эти методы не являются удовлетворительными). И ПОСЛЕСЛОВИЯ используют назначение, которое работает как ссылка. Например:

 $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;