Borradologico (soft delete) con integridad referencial

Buenas Tardes

Estoy comenzando con Yii y me gustaria saber si es posible manejar esto de alguna forma sencilla.

Ya realizo el borrado actualizando un campo borrado en el Modelo de la tabla y de igual forma tengo un Scope por default para no mostrar los datos.

public function delete()

{


    $this->borrado = 1;


    return $this->save();


}

public function defaultScope()

{


    return array("condition" => "t.borrado=0");


}

Pero no se como hacer para manejar la integridad referencia, ya que no tiene sentido que permita borrar datos, así sea a nivel lógico y me deje hijos de los registros sin registro padre, que es el principio de la integridad.

Como puedo manejarlo de la mejor manera y utilizando el potencial de Yii y el registro de las relaciones de las tablas?

Encontre unos articulo y post manejando el borrado lógico con behavior, pero no se si por el contrario complique mas las cosas.(No adiciono los link por que es mi primer comentario y no permite el sistema), pero en ninguno veo el tema de integridad referencial.

(Version YII: yii-1.1.8.r3324)(Base de datos: MS SQL 2005)

Agradezco cualquier colaboración u apoyo que me puedan brindarme.

Gracias

Hola ricaurteg,

Asumo que cuando dice integridad referencial del borrado lógico se refiere a que los registros hijos deberían ser borrados lógicamente también.

Bueno, para ese propósito lo más fácil es hacer un "foreach" por la relaciones buscando las relaciones "HAS_MANY" y luego a esas un nuevo "foreach" haciendo otro delete sobre esos registros… en código semi-Yii XD sería algo así:




public function delete(){

  $this->borrado = 1;

  if($this->save()){

    foreach($this->relations() as $relation){

      if($relation->type == HAS_MANY){ // Toca ajustar esta línea

        $relName = $relation->name; //Algo similar a esto

        foreach($this->$relName as $record){

          $record->delete();

        }

      }

    }

  }

}



Este código se podría poner en el modelo base de los demás modelos, y así se heredan para todos y no se tendría que estar duplicando código en cada modelo.

Espero sea de utilidad.

Saludos, éxitos y felices fiestas.

Esa no es tarea del motor de base de datos…?

Hola

Gracias por respuesta, realmente me mostro un camino para menejar la integridad, aunque no quiero que se realice un borrado en cascada, solo que pueda proteger que no queden registros hijos volando.

Modifique la función y aunque funciona la veo poco eficiente. No se si exista alguna forma de mejorarla.

public function delete()

{


    $rel_exist=0;


    foreach($this->relations() as $rel_name => $rel_type)


    {


      if (($rel_type['0'] == self::HAS_MANY) or ($rel_type['0'] == self::HAS_ONE))           {    


          


          $criteria = new CDbCriteria();


          $criteria->with=array($rel_name);


          $criteria->addCondition('t.id ='. $this->id .' AND t.borrado=0 AND '. $rel_name.'.borrado=0');


          $nameModel=get_class($this);


          $localModel = new $nameModel;


          if ($record = $localModel->findAll($criteria)) $rel_exist =1;              


      }


    }


    if($rel_exist==0){


        $this->borrado = 1;


        return $this->save();


    }


    else {


        return false;


    }


}

Quedo pendiente de cualquier ayuda. ok