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

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_documentoPero 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, @rownum:…

Como implementar SCRUM en 10 pasos fáciles - Paso #1: Ordena tu "Pila del Producto"

Esta es la continuación de la serie: Como implementar SCRUM en 10 pasos fáciles. Creación de Kelly Waters y traducida con la autorización correspondiente por su servidor.


La entrada original de este artículo es: Get your backlog in order

Ordena tu "Pila del Producto"
¿Así que quieres implementar Scrum?
¿Y te gusta la idea de hacerlo fácilmente?
Entonces escucha. Este es el paso 1 en mi serie: ¿Cómo implementar Scrum en 10 pasos fáciles.
Este no es solo el primer paso. Es el paso más importante.
A menos que puedas llevar a cabo este paso, no sigas. No lo saltes. Te prometo que te arrepentirás si lo haces. Incluso si no continuas, es probable que este paso te beneficie, a tu equipo y a tu organización.
Así que aquí está.
Primero, ¿dónde deberíamos empezar?
Alineación con el negocio
Primero, antes de nada, debes alinear tu equipo de desarrollo con el negocio.
Si eres parte de una unidad de negocio, eso puede ser natural y directo. Si estas en una organización central de desarrol…

jQuery DataTables y CodeIgniter

Ajax Source Datatables permite configurar fácilmente el origen de datos de la tabla, para que esta sea generada dinámicamente desde el servidor, así que con CodeIgniter tendríamos el siguiente código

public function page(){ $data['pedidos'] = $this->pedidos_model->get_pedidos($this->input->post('iDisplayStart')); define('AJAX_REQUEST', 1);//truco para que en nginx no muestre el debug $TOTAL = $this->pedidos_model->total(); echo json_encode(array('aaData'=>$data['pedidos'], 'iTotalRecords'=>$TOTAL, 'iTotalDisplayRecords'=>$TOTAL, 'sEcho'=>$this->input->post('sEcho'))); }
Este método producirá algo parecido a esto:

{"iTotalRecords":83099,"iTotalDisplayRecords":83099,"sEcho":"2", "aaData":[{"Id":"85514","num":"86109",&q…