Copiar Valor De Clave Primaria.

Hola a todos, ¿cómo les va? tengo la siguiente situación:

  1. En mysql tengo una tabla "solicitud" con una PK "id_solicitud" y otro campo "nro_ticket".

  2. Me piden que el campo "nro_ticket" guarde el mismo valor de la PK "id_solicitud".

Se preguntarán para qué quiero dos campos con el mismo valor. Primero quisiera saber si es posible hacerlo y segundo porque el requerimiento es que el campo "nro_ticket" guarde el valor de la PK "id_solicitud" pero con otro dato que es la fecha. Es decir, algo así como esto:




|solicitud|

----------------------------

|id_solicitud | nro_ticket |

----------------------------

|1            | 1-20121114 |

|2            | 2-20121114 |

----------------------------



La solución es posible desde la función "afterSave" del modelo… sin embargo, yo lo haría de otra manera:

el número de ticket lo dejaría sin el de la llave primaria (para evitar dos escrituras) y mejor creo una índice o llave alterna compuesto por los dos campos (id+nro_ticket).

Y para simplificar el proceso de muestreo se crea una función en el modelo Solicitud así:




public function getNumeroTicket(){

  return $this->id.'-'.$this->nro_ticket;

}

Pensándolo bien, creo que yo guardaría el valor completo de nro_ticket (id+nro) solo en el caso en que fuera un campo MUY consultado (el muy multiplicado por 10 mil)… pero solo por rendimiento de consulta… que sería el único caso en donde se sacrifica tiempo de escritura y se favorece tiempo de consulta.

Saludos

A ver, soy nuevo con yii y php en general. Mi "id_solicitud" es autoincrementable y es la clave primaria.

En el modelo coloqué no requerido a "nro_ticket" y en el _form quiero pasarle el valor al campo Nro_ticket asi:




<?php

			//$model=new RegReqSigesp_Solicitud;

			//$usuario=Yii::app()->user->id;

			//$a=$model->Id_RegReqSigesp_Solicitud;


			$a=112;

	?>


<div class="row">

		<?php //echo $form->labelEx($model,'NroTicket_RegReqSigesp_Solicitud'); ?>

		<?php echo $form->textField($model,'NroTicket_RegReqSigesp_Solicitud', array('hidden'=>'hidden', 'readonly'=>'readonly', 'TYPE'=>"hidden",'value'=>$a)); ?>

		<?php echo $form->error($model,'NroTicket_RegReqSigesp_Solicitud'); ?>

	</div>



De esta manera al crear una solicitud el numero de ticket será "112" ya que es un entero. Asi funciona bien.

Ahora lo que necesito es que en vez de "112" me guarde el valor del campo "Id_RegReqSigesp_Solicitud" del modelo.

Asumo que "Id_RegReqSigesp_Solicitud" es la llave primaria?

Si es así, entonces sólo es posible hacerlo en la función afterSave del modelo (Que se ejecuta después de guardar el modelo)

algo así:




class RegReqSigesp_Solicitud extends CActiveRecord{

...

public function afterSave(){

  if($this->getIsNewRecord()){

    $this->setIsNewRecord(false); // Para garantizar que no quede en un loop

    $this->NroTicket_RegReqSigesp_Solicitud = Id_RegReqSigesp_Solicitud;

    $this->save(false); // False para saltar las validaciones

  }

}

...

}



Coloqué tal función el en modelo y me lanza este error


Use of undefined constant Id_RegReqSigesp_Solicitud - assumed 'Id_RegReqSigesp_Solicitud' 

Creí que se resolvería con esto:


$this->NroTicket_RegReqSigesp_Solicitud=$this->NroTicket_RegReqSigesp_Solicitud;

pero al crear la solicitud, al enviarme a la vista. Guarda cero


Nro Ticket Reg Req Sigesp Solicitud: 0

Sí es correcto, olvidé el "$this"… En cuanto al valor creería que significa que la llave primaria no es autoincremental.

Sea dicho de paso que las llaves primarias es mejor cuando se llaman "id" solamente, sin prefijos ni sufijos innecesarios. En lo posible una tabla debería ser así (por facilidad de lectura y mantenimiento):

NombreTabla


id

  • nombre

  • descripcion

  • foraneo1_id

  • foraneo2_id

  • usuario_lider_id

  • tipo_id

Lo anterior es un ejemplo ;)

Saludos

Le puse el $this pero como te dije me guarda cero. No el valor de la primary key!!

He Intentado hacer esto también por favor para que me orienten al respecto…

En mi controlador hace hice esto:




public function ObtenerId()

{

    $sql="SELECT MAX(Id_RegReqSigesp_Solicitud) AS id FROM RegReqSigesp_Solicitud";


    $comando=Yii::app()-> db->createCommand($sql);

				

    if ($row=mysql_fetch_row($comando))

	{

		$id=trim($row[0]);

					

	}

    

    return $id;

}



luego en mi "_form"





$a=$this->ObtenerId();


        <div class="row">

		<?php //echo $form->labelEx($model,'NroTicket_RegReqSigesp_Solicitud'); ?>

		<?php echo $form->textField($model,'NroTicket_RegReqSigesp_Solicitud', array('hidden'=>'hidden', 'readonly'=>'readonly', 'TYPE'=>"hidden",'value'=>$a)); ?>

		<?php echo $form->error($model,'NroTicket_RegReqSigesp_Solicitud'); ?>

	</div>



Entonces al tratar de crear una nueva solicitud me da este error:




mysql_fetch_row() expects parameter 1 to be resource, object given


...controllers/RegReqSigesp_SolicitudController.php(210)


public function ObtenerId()

205     {

206         $sql="SELECT MAX(Id_RegReqSigesp_Solicitud) AS id FROM RegReqSigesp_Solicitud";

207 

208                 $comando=Yii::app()-> db->createCommand($sql);

209                 

210                 if ($row=mysql_fetch_row($comando))

211                 {

212                     $id=trim($row[0]);

213                     

214                 }

215                 return $id;

216     }




Y no encuentro a qué se refiere!

Hay una error de concepto:

Si utiliza createCommando NO DEBE usar las funciones propias de mysql (con Yii uno en cierto modo pasa por alto las funciones de cada motor de base de datos para más bien concentrarse en lo importante).

Así que sería algo así:


$consulta=Yii::app()-> db->createCommand($sql)->queryAll() // o queryRow(), queryScalar() o queryColumn();

Saludos

Nuevamente, verifique que la llave primaria sea incremental, y adicionalmente es conveniente usar la notación que mencioné arriba:

Si la llave foránea no es incremental entonces siempre se devolverá 0 o en su defecto NULL

Perdonen!!! me habia equivocado…

En la linea de abajo siempre guardará cero porque el campo al principio es cero.


$this->NroTicket_RegReqSigesp_Solicitud=$this->NroTicket_RegReqSigesp_Solicitud;

Me equivoqué es así:


$this->NroTicket_RegReqSigesp_Solicitud =$this->Id_RegReqSigesp_Solicitud;

Como dice robregonm… Gracias amigo, muchas gracias! :) Lo único que hice fue agregarle el


$this->

De todas maneras voy a analizar lo otro que me dijiste porque seguramente lo voy a necesitar más tarde.

Oye, estaba revisando en el class reference la función


afterSave()

para ver si encontraba cómo está programada por dentro pensando que encontraría algo asi como un


last_insert_id()

o


max(id) mysql

o quizás un


@@identity

que es lo que al principio se me había ocurrido pues estoy recién aprendiendo mysql y php. Pero veo que son métodos de una u otra clase que a su vez llaman a otros métodos y al final me muestra un pedazo del codigo… Yo quiero aprender, la pregunta es ¿dónde encuentro el código de éstos métodos? la interrogante va porque si en algún momento me toca hacer esto mismo pero sin yii entonces estaría perdido.

Yii lo hace después del afterSave XD

Lo que sucede es q internamente Yii refresca los datos del modelo cuando hace un insert o un update.

Saludos.