Yii Косвенная модификация перегруженного свойства - PullRequest
14 голосов
/ 17 марта 2011
$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();

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

Косвенная модификация перегруженного свойства Bids :: $ seller не оказывает влиянияна другом сервере?Как это исправить?Или переопределить директивы php?Есть идеи?TNX

Ответы [ 2 ]

18 голосов
/ 17 марта 2011

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

function foo() {
    return 42;
}

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

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

$seller = $this->seller;
$seller->current_item++;
$seller->wins++;
$seller->save();
2 голосов
/ 16 июля 2013

У меня также было сообщение об ошибке "Косвенное изменение 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...