Yii Framework Forum: Copiar Valor De Clave Primaria. - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Copiar Valor De Clave Primaria. ¿Cómo copiar el valor de una PK a otro campo de la misma tabla? Rate Topic: -----

#1 User is offline   Eduardo Méndez 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 29-June 12

Posted 14 November 2012 - 10:01 AM

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 |
----------------------------

0

#2 User is offline   robregonm 

  • Experienced Yii Developer
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 602
  • Joined: 30-July 09
  • Location:Colombia

Posted 14 November 2012 - 01:08 PM

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;
}

Ricardo Obregón
LinkedIn Profile
YiiFramework en Español - http://yiiframework.co/ - Yii Code Generator for Bootstrap
http://obregon.co/ - https://1server.co/
PHP 5.5+, nginx, MySQL, PostgreSQL, Yii 1.x & 2.x, CanJS and more.
Follow me: @robregonm & @obregonco & @1ServerCo.
0

#3 User is offline   robregonm 

  • Experienced Yii Developer
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 602
  • Joined: 30-July 09
  • Location:Colombia

Posted 14 November 2012 - 01:10 PM

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


Ricardo Obregón
LinkedIn Profile
YiiFramework en Español - http://yiiframework.co/ - Yii Code Generator for Bootstrap
http://obregon.co/ - https://1server.co/
PHP 5.5+, nginx, MySQL, PostgreSQL, Yii 1.x & 2.x, CanJS and more.
Follow me: @robregonm & @obregonco & @1ServerCo.
0

#4 User is offline   Eduardo Méndez 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 29-June 12

Posted 14 November 2012 - 02:21 PM

View Postrobregonm, on 14 November 2012 - 01:10 PM, said:

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.
0

#5 User is offline   robregonm 

  • Experienced Yii Developer
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 602
  • Joined: 30-July 09
  • Location:Colombia

Posted 15 November 2012 - 09:21 AM

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
  }
}
...
}


Ricardo Obregón
LinkedIn Profile
YiiFramework en Español - http://yiiframework.co/ - Yii Code Generator for Bootstrap
http://obregon.co/ - https://1server.co/
PHP 5.5+, nginx, MySQL, PostgreSQL, Yii 1.x & 2.x, CanJS and more.
Follow me: @robregonm & @obregonco & @1ServerCo.
0

#6 User is offline   Eduardo Méndez 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 29-June 12

Posted 15 November 2012 - 10:54 AM

View Postrobregonm, on 15 November 2012 - 09:21 AM, said:

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

0

#7 User is offline   robregonm 

  • Experienced Yii Developer
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 602
  • Joined: 30-July 09
  • Location:Colombia

Posted 15 November 2012 - 11:24 AM

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
Ricardo Obregón
LinkedIn Profile
YiiFramework en Español - http://yiiframework.co/ - Yii Code Generator for Bootstrap
http://obregon.co/ - https://1server.co/
PHP 5.5+, nginx, MySQL, PostgreSQL, Yii 1.x & 2.x, CanJS and more.
Follow me: @robregonm & @obregonco & @1ServerCo.
0

#8 User is offline   Eduardo Méndez 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 29-June 12

Posted 15 November 2012 - 01:26 PM

View Postrobregonm, on 15 November 2012 - 11:24 AM, said:

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!!
0

#9 User is offline   Eduardo Méndez 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 29-June 12

Posted 15 November 2012 - 02:03 PM

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!
0

#10 User is offline   robregonm 

  • Experienced Yii Developer
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 602
  • Joined: 30-July 09
  • Location:Colombia

Posted 16 November 2012 - 01:59 PM

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
Ricardo Obregón
LinkedIn Profile
YiiFramework en Español - http://yiiframework.co/ - Yii Code Generator for Bootstrap
http://obregon.co/ - https://1server.co/
PHP 5.5+, nginx, MySQL, PostgreSQL, Yii 1.x & 2.x, CanJS and more.
Follow me: @robregonm & @obregonco & @1ServerCo.
0

#11 User is offline   robregonm 

  • Experienced Yii Developer
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 602
  • Joined: 30-July 09
  • Location:Colombia

Posted 16 November 2012 - 02:01 PM

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

Quote

NombreTabla
--------------
# id
* nombre
* descripcion
* foraneo1_id
* foraneo2_id
* usuario_lider_id
* tipo_id
....



Si la llave foránea no es incremental entonces siempre se devolverá 0 o en su defecto NULL
Ricardo Obregón
LinkedIn Profile
YiiFramework en Español - http://yiiframework.co/ - Yii Code Generator for Bootstrap
http://obregon.co/ - https://1server.co/
PHP 5.5+, nginx, MySQL, PostgreSQL, Yii 1.x & 2.x, CanJS and more.
Follow me: @robregonm & @obregonco & @1ServerCo.
0

#12 User is offline   Eduardo Méndez 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 29-June 12

Posted 19 November 2012 - 02:38 PM

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->

0

#13 User is offline   Eduardo Méndez 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 29-June 12

Posted 19 November 2012 - 02:39 PM

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

#14 User is offline   Eduardo Méndez 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 29-June 12

Posted 23 November 2012 - 03:06 PM

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.
0

#15 User is offline   robregonm 

  • Experienced Yii Developer
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 602
  • Joined: 30-July 09
  • Location:Colombia

Posted 25 November 2012 - 02:37 PM

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.
Ricardo Obregón
LinkedIn Profile
YiiFramework en Español - http://yiiframework.co/ - Yii Code Generator for Bootstrap
http://obregon.co/ - https://1server.co/
PHP 5.5+, nginx, MySQL, PostgreSQL, Yii 1.x & 2.x, CanJS and more.
Follow me: @robregonm & @obregonco & @1ServerCo.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users