2011-03-17 6 views
13
$winnerBid = Bids::model()->find($criteria); 

modelo tiene siguientes relaciones:Yii modificación indirecta de la propiedad sobrecargada

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'), 
     ); 
    } 

Cuando estoy tratando de ahorrar:

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

estoy consiguiendo error:

Indirect modification of overloaded property Bids::$seller has no effect (/var/www/auction/www/protected/models/Bids.php:16)

Pero fue todo g bien en otro servidor? ¿Cómo solucionarlo? ¿O anular las directivas php? ¿Algunas ideas? TNX

Respuesta

17

El problema aquí es que $seller no es una propiedad "real" (Yii implementa propiedades en sus modelos utilizando el método mágico __get), lo que en efecto está tratando de modificar el valor de retorno de una función (que no tiene efecto). Es como si se trató de hacer:

function foo() { 
    return 42; 
} 

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

No estoy seguro sobre el estado de este comportamiento en diferentes versiones de PHP, pero no es una solución fácil que puede utilizar:

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

Tnx, para la respuesta. pero ahora estoy obteniendo el error Fatal: Llamar al método indefinido stdClass :: save() en /var/www/auction/www/protected/models/Bids.php en la línea 1 – Joeeee

+0

@Joeeee: Then '$ this-> seller' no es el objeto que debería ser, claramente debe ser una subclase de 'CActiverRecord', pero no es (posiblemente es 'nulo'). Tendrás que investigar eso. – Jon

+0

THX, __get overrided() rocas :) – Joeeee

2

I también tenía el mensaje de error "Yii modificación indirecta de la propiedad sobrecargada" al intentar manipular de forma masiva los atributos mediante la propiedad de atributos CActiveRecord.

Luego, descubrí otro método para solucionar este problema, en un caso en el que el método mágico está relacionado con una variable de objeto que contiene una matriz, crea un ARCHIVO AUXILIAR en el que colocas el original y el nuevo valores (a veces uno quiere REEMPLAZAR un valor relacionado con una de las claves, y estos métodos no son satisfactorios). Y DESPUÉS usa una asignación, que funciona como la referencia. Por ejemplo:

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