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