Hola a todos, ¿cómo les va? tengo la siguiente situación:
En mysql tengo una tabla "solicitud" con una PK "id_solicitud" y otro campo "nro_ticket".
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:
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.
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
}
}
...
}
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):
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;
}
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 }
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();
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.