ppazos / yupp

Automatically exported from code.google.com/p/yupp
0 stars 0 forks source link

Problema con salvado de relacion hasMany a la misma clase #112

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Si tengo A hasMany A, el siguiente codigo de PO.isOwnerOf puede causar 
problemas y no salvar las relaciones hasMany en PM:

..
else if ( array_key_exists ( $attr, $this->hasMany ) )
{
  $obj = new $this->hasMany[$attr]();

  if ($obj->hasOneOfThis( $_thisClass )) // 4) bidireccional 1..*
  {
    return true;
  }
  else
  {
    // 6) bidireccional *..*
    if ($obj->hasManyOfThis( $_thisClass  )) -- el problema es acá, porque si $obj es A, siempre va a decir que A hasMany A ($_thisClass también es A), y el resultado dependerá de si declaro o no el belongsTo, y si no lo tengo declarado, va a dar false (que es inconsistente con la semántida definida para la operación isOwnerOf).
    {
      return $obj->belonsToClass( $_thisClass ); // problema: get_class(this) tira PO...
    }
    else // casos 3 o 5, como es unidireccional, toma el control la clase del lado que no es visto de la otra.
    {
      return true;
    }
  }
}

Original issue reported on code.google.com by pablo.swp@gmail.com on 12 Jun 2011 at 5:48

GoogleCodeExporter commented 8 years ago
Cuando se declara una relacion A hasMany A, en realidad se toma como 
cardinalidad *->*, porque si a1 hasMany(a2, a3), también se puede dar a2 
hasMany(a1,a4).

Según las convenciones actuales, este caso se considerará análogo a 1->*. 
Esto es correcto a nivel de implementación, pero a nivel de modelo implica 
cosas distintas (1->* es distinto a *->*, 1->* está modelando un árbol y *->* 
un grafo).

Original comment by pablo.swp@gmail.com on 12 Jun 2011 at 5:35

GoogleCodeExporter commented 8 years ago
Se agregó esta línea luego del else

// Si tengo una relacion hasMany con migo mismo, tengo 1->* o *->*, para ambos 
casos debería devolver true.
if ($this->hasMany[$attr] == $_thisClass) return true;

Está funcionando ok, lo verifiqué con el test case A004. Cierro el ticket.

Original comment by pablo.swp@gmail.com on 24 Apr 2012 at 2:19