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();

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

Косвенная модификация перегруженных property Bid:: $продавец не действует (/var/www/auction/www/protected/models/Bids.php:16)

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

Ответ 1

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

function foo() {
    return 42;
}

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

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

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

Ответ 2

У меня также было сообщение об ошибке "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;