Cómo asociar los siguientes modelos relacionados? (hasMany, belongsTo, etc...)

130 views
Skip to first unread message

Lalo Landa

unread,
Jan 29, 2014, 12:13:10 PM1/29/14
to cakep...@googlegroups.com
Hola,

tengo el modelo User, el modelo Ticket y el modelo TicketResponse relacionados por id de la siguiente forma

User
id
...

Ticket
id
from_user_id -> id.User
to_user_id     -> id.User
subject

TicketResponses
id
ticket_id -> id.Ticket
from_user_id -> id.User
body

Las relaciones serian:
- Un usuario puede crear varios tickets
- Un ticket pertenece solo a UN usuario
- Un ticket puede tener NINGUNA/VARIAS respuestas y NINGUNO/UNO usuarios

Resumiendo: yo mando un ticket a un usuario y me lo puede responder o no.

Como llevo eso a hasMany, belongsTo, etc?


Esto fue lo q hice, no se si esta bien planteado y usado:

Ticket.php
[CODE]
class Ticket extends AppModel{
        //un ticket pertenece solo a UN usuario
        public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'id'
        )
        );
       
        //un ticket puede tener ninguna/varias respuestas
        public $hasMany = array(
        'TicketResponse' => array(
            'className' => 'TicketResponse',
            'foreignKey' => 'ticket_id'
           
            )          
    );
}
[/CODE]

TicketResponse.php
[CODE]
class TicketResponse extends AppModel{
        //una respuesta pertenece a UN SOLO ticket y a UN solo usuario
        public $belongsTo = array(
            'Ticket' => array(
                'className' => 'Ticket',
                'foreignKey' => 'id'
            ),
            'User' => array(
                'className' => 'User',
                'foreignKey' => 'id'

                )  
        );
}
[/CODE]

Aland Laines

unread,
Jan 29, 2014, 1:34:06 PM1/29/14
to cakep...@googlegroups.com
Por la manera en que estas usando el esquema de base de datos en la tabla Tickets , no usarías las relaciones directamente en el modelo hacia User, ya que tienes dos claves foráneas hacia User, solo las tendrías como una referencia, ahora que si el from_user_id indica a quien pertenece, indícale ese campo en el modelo, te quedaría así:

Ticket.php
[CODE]
class Ticket extends AppModel{
        //un ticket pertenece solo a UN usuario
        public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'from_user_id'

        )
        );
       
        //un ticket puede tener ninguna/varias respuestas
        public $hasMany = array(
        'TicketResponse' => array(
            'className' => 'TicketResponse',
            'foreignKey' => 'ticket_id'
           
            )          
    );
}
[/CODE]

Ahora en la tabla TicketResponse el from_user_id, a mi parecer esta de mas, ya que si como dices el ticket solo le pertenece a un usuario, entonces el es el único que tendría que responder y esta información ya esta contenida en el Ticket, así como también a quien debe responder. Claro esta apreciación la hago en base a lo que envías, no se en global cuales son tus procesos, quizás estoy equivocado.

Un abrazo,

Aland Laines Calonge
Twitter: @lainessolutions


--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a cakephp-esp...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/cakephp-esp.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Lalo Landa

unread,
Jan 30, 2014, 6:02:07 AM1/30/14
to cakep...@googlegroups.com
Hola, gracias por tu respuesta.
Todo este tema viene a q quiero usar saveAssociated para guardar datos q vienen de un form en la tabla TICKETS y en la tabla TICKETS_RESPONSES.
Los datos me los trae bien pero no me los guarda y me tira error de base de datos con las claves foraneas.

Error: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`blog2`.`ticket_responses`, CONSTRAINT `ticket_responses_ibfk_2` FOREIGN KEY (`from_user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE)


Ya revise si tengo los mismos tipos de datos y demas.

Entonces pense q se debia a como habia declarado el tema de hasMany y belongsTo y lo sigo creyendo.

El from_user_id en la tabla tickets_responses seria el id del usuario q responde al ticket original o primario.

Igual estoy replanteando todo pero voy a probar lo q me dijiste

Saludos y cualquier problema vuelvo a comentar

Lalo Landa

unread,
Jan 30, 2014, 8:31:04 AM1/30/14
to cakep...@googlegroups.com
Soy un pel***do importante!

El error se debia a q no estaba utilizando correctamente los campos en el form para la asociacion hasMany.

Yo estaba haciendo:
[HIGHLIGHT="PHP"]echo $this->Form->input('TicketResponse.body',
                        array('type' => 'textarea', 'label' => 'Mensaje'));[/HIGHLIGHT]
...pero eso se utiliza cuando la asociacion es hasOne

...para hasMany se usa la forma:
[HIGHLIGHT="PHP"]echo $this->Form->input('TicketResponse.0.body',
                        array('type' => 'textarea', 'label' => 'Mensaje'));[/HIGHLIGHT]

Y se ve claramente el error haciendo un pr en ambos casos
Reply all
Reply to author
Forward
0 new messages