Ir al contenido principal

ForeignKeyName y el errno 121 en Doctrine

Primero analicen las siguientes clases:

 class HistorialExpedienteConciliacionIndividual extends Doctrine_Record
  {
      public function setTableDefinition()
      {
           $this->setTableName('HistorialExpedienteConciliacionIndividual');
           $this->hasColumn('id_estado','integer');
           $this->hasColumn('id_expediente','integer');           
           $this->hasColumn('id_usuario', 'integer');
      }
      
      public function setUp()
      {
             $this->hasOne('EstadoExpediente as estado',array('local'=>'id_estado','foreign'=>'id'));
           $this->hasOne('ExpedienteConciliacionIndividual as expediente',array('local'=>'id_expediente','foreign'=>'id'));           
           $this->hasOne('Usuario', array('local'=>'id_usuario','foreign'=>'id'));   
           $this->actAs('Timestampable'); 
      }           
  }

class HistorialExpedienteDefensoria extends Doctrine_Record
  {
      public function setTableDefinition()
      {   
           $this->setTableName('historialexpedientesdefensoria');
           $this->hasColumn('fecha','date');
           $this->hasColumn('id_estadoexpedientedefensoria','integer',null); 
           $this->hasColumn('id_juzgado','integer',null);                              
           $this->hasColumn('id_expediente','integer',null); 
           
      }
      public function setUp()
      {

           $this->hasOne('OrganoJuzgado',array('local'=>'id_juzgado','foreign'=>'id'));
           $this->hasOne('EstadoExpedienteDefensoria as estados', array('local' => 'id_estadoexpedientedefensoria', 'foreign' => 'id'));   
           $this->hasOne('ExpedienteDefensoria as expedientes', array('local' => 'id_expediente', 'foreign' => 'id'));   
           $this->actAs('Timestampable'); 
      }  
}




Si estas dos clases se ejecutan para crear las correspondiente tablas nos da el siguiente error:


SQLSTATE[HY000]: General error: 1005 Can't create table '.\siscolab\#sql-88c_22.frm' (errno: 121). Failing Query: "ALTER TABLE `historialexpedientesdefensoria` ADD CONSTRAINT `hiei` FOREIGN KEY (`id_estadoexpedientedefensoria`) REFERENCES `estadosexpedientedefensoria`(`id`)". Failing Query: ALTER TABLE `historialexpedientesdefensoria` ADD CONSTRAINT `hiei` FOREIGN KEY (`id_estadoexpedientedefensoria`) REFERENCES `estadosexpedientedefensoria`(`id`)

Doctrine intenta crear el constraint de la relación haciendo una combinación de los nombres de las tablas relacionadas. En este caso existió la casualidad de que existen esas tablas con estructuras y relaciones bastante parecidas, creando el error de ejecución anterior.

Para resolver este debemos hacer uso de la opcion foreignKeyName al crear las relaciones, tanto con el hasOne como con el hasMany, esto en al menos una de las clases y entonces quedaría como sigue.

class HistorialExpedienteConciliacionIndividual extends Doctrine_Record
  {
      public function setTableDefinition()
      {
           $this->setTableName('HistorialExpedienteConciliacionIndividual');
           $this->hasColumn('id_estado','integer');
           $this->hasColumn('id_expediente','integer');           
           $this->hasColumn('id_usuario', 'integer');
      }
      
      public function setUp()
      {
          $this->hasOne('EstadoExpediente as estado',array('local'=>'id_estado','foreign'=>'id', 'foreignKeyName' => 'fk_estados_historialconciliacion'));
           $this->hasOne('ExpedienteConciliacionIndividual as expediente',array('local'=>'id_expediente','foreign'=>'id', 'foreignKeyName' => 'fx_expedientes_historialconciliacion'));           
           $this->hasOne('Usuario', array('local'=>'id_usuario','foreign'=>'id'));   
           $this->actAs('Timestampable'); 
      }           
  }

Esto ya resuelve el problema del errno 121

Comentarios

Entradas populares de este blog

Enumerar filas en una consulta con MySQL

Supongamos que tenemos tablas con la estructura siguiente: documentos (iddocumento, nombre_documento, url_original, idtipo_documento, idproyecto) proyectos (idproyecto, nombre_proyecto, longitud, unidad_medida) tipo_documentos (idtipo_documento, descripcion_tipo_documento) Tenemos necesidad de hacer una consulta como la siguiente: "Enumerar todos los documentos en la base de datos agrupados por proyecto" Parece fácil, excepto por el término "enumerar", aquí tienes un truquito para que logres enumerar tus consultas: SELECT (@rownum:=@rownum+1) AS rownum, nombre_documento, descripcion_tipo_documento, nombre_proyecto FROM (SELECT @rownum:=0) r, documentos AS d INNER JOIN proyectos AS p ON d.idproyecto = p.idproyecto INNER JOIN tipo_documentos AS td ON d.idtipo_documento = td.idtipo_documento Pero que tal si te piden que enumeres los proyectos con sus correspondientes documentos?. Teniendo lo anterior es un poco mas sencillo SELECT IF(@fila=proyectos.idproyecto,

¿Avances en el problema de las Direcciones en Nicaragua 2020?

Existen relativamente abundantes artículos quejandose, burlandose, o intentando explicar ( 1 , 2 ) la particularidad de las direcciones nicaragüenses, entre el ruido de quejas, se vislumbran algunas propuestas para crear una nomenclatura estándar, ninguna hasta hoy ha sido implementada. Sin embargo con el advenimiento de la tecnología, incluso en los países con nomenclaturas específicas y alta densidad de señalización, es mas común buscar una dirección en una de las varias aplicaciones existentes(Google Maps, Waze, OpenStreetMap, etc) y esta te guiará paso a paso("turn-by-turn") hacia tu destino. Por eso pienso que en lugar de intentar forzar una nomenclatura que podría tardar años en aplicarse, se debería dar una respuesta tecnológica al problema y luego avanzar hacia la tan anhelada estandarización. Aunque en estos tiempos la movilidad de las personas se ha reducido, al contrario la cantidad de empresas que proveen servicios de envío o transporte hacia domicilios ha crecido

"Abrir carpeta contenedora" en Firefox y KDE 4.3.x lanza Cervisia

Este es un bug conocido desde hace algún tiempo, pero hay un truco que puede solucionarlo: Edita cervisia.desktop y kfmclient-dir.desktop localizado en /usr/share/applications/kde4 y agrega una linea con "OnlyShowIn=KDE;". Despues de actualizar "update-mime-cache" firefox usará dolphin. Mas información: https://bugzilla.mozilla.org/show_bug.cgi?id=266600 Actualización: El proceso al fin y al cabo le falta un paso mas. Cuando volvi a probar abrir un archivo desde la opción de "Abrir carpeta contenedora", me pidió que asociara el archivo a un programa, así que nada mas me tocó buscar donde se encuentra dolphin(/usr/bin/) y marcar la opción recordar asociación Actualización: En OpenSUSE 11.2 el problema fue solucionado.