como traer los valores con has_many?

30 views
Skip to first unread message

braulio bracamonte

unread,
Aug 8, 2020, 5:17:00 AM8/8/20
to KumbiaPHP Framework
hola, saludos a todos, llevo como 6 o 7 horas buscando como usar la relación has_many;
logré encontrar como se usa la belongs_to que es la que viene en el ejemplo: $cliente->getCiudad()->nombre;
osea si tengo $cliente, asi puedo sacar el nombre de su ciudad (con el belongs_to), pero si tengo la ciudad (ya sea nombre o id), como puedo sacar los clientes con esa ciudad?

Nelson Rojas Nuñez

unread,
Aug 8, 2020, 8:56:29 AM8/8/20
to KumbiaPHP Framework
Estimado,
Le recomiendo leer el artículo que escribió Govani en su web soyprogramador.liz.mx, en ella encontrará una sección dedicada a KumbiaPhp y dentro de la misma un post relacionado con el uso de esas características de activerecord.
https://soyprogramador.liz.mx/2016/04/17/relaciones-entre-modelos-con-kumbiaphp

También puedes mirar en esta documentación no oficial si hay algo que sea de tu utilidad https://github.com/nelsonrojas/Documentation/blob/master/es/active-record.md
Saludos cordiales.

braulio bracamonte

unread,
Aug 8, 2020, 2:48:58 PM8/8/20
to KumbiaPHP Framework
excelente, si dí con esos articulos varias veces, pero no se porque no me quedaba claro, pero ahora que me lo enviaste, lo leí con mas calma y ya quedó, creo que igual lo que me hacía falta era dormir

Gracias

Nelson Rojas Nuñez

unread,
Aug 8, 2020, 9:11:39 PM8/8/20
to KumbiaPHP Framework
Estimado Braulio,

A pesar de que lo que te diré podrá ser tomado como un comentario poco popular, en ocasiones es bueno ir a lo simple en vez de ir por la magia.

Me explico. Si tenemos el modelo cliente, y el de ciudad como indicabas y nos ponemos en 2 escenarios:
1. Con la lista de clientes queremos mostrar el nombre de la ciudad.
2. Con la lista de ciudades, queremos traer la lista de clientes que están en ella.

Lo sencillo, y fácil de entender habría sido usar el simple, pero poderoso find y nada de métodos mágicos. El uso de métodos mágicos nos puede parecer dulce, nos hace sentir cool, pero cuando alguien más tenga que hacer el mantenimiento, intentará buscar el método getCiudad en el modelo de cliente y tendrá que leer todo respecto de activerecord para caer que es parte de la carga automática de relaciones en el modelo.

Por otro lado, con el simple find, la cosa quedará claro ahora y en 3 años más.

Entonces, para resolver el caso 1:
foreach($clientes as $cliente):
     $ciudad = (new Ciudad)->find_first('conditions: ciudad_id = ' . $cliente->ciudad_id);
     echo $cliente->nombre . PHP_EOL;
     echo $ciudad->nombre . PHP_EOL;
endforeach;

Como ves, si alguien usa un IDE como Eclipse, Netbeans, Code con herramientas de Intellisence u otra, al hacer click para ver la documentación de find_first, lo hallará rápidamente.

El segundo escenario es más o menos igual:
foreach($ciudades as $ciudad):
    $clientes = (new Cliente)->find('conditions: ciudad_id = ' . $ciudad->id);
    echo $ciudad->nombre . PHP_EOL;
    foreach($clientes as $cliente):
        echo $cliente->nombre . PHP_EOL;
    endforeach;
endforeach;

Si te fijas, es simple de leer, y te habrías ahorrado las horas buscando información.

Como bien dicen, usar KISS: Keep it Simply Stupid: Mantenerlo lo más sencillo posible.
Es enemigo del mantenimiento el código demasiado INTELIGENTE. En su defecto, prefieran en lo posible hacer el código con lo básico, aunque parezca tonto decirlo, es mucho mejor y uno ahorra tiempo leyendo código que hizo mucho tiempo antes.

Una cosa más, ahora ni siquiera necesitarás definir el has_many ni el belongs_to, y por tanto tampoco necesitará una explicación extra en el código del modelo.

Un abrazo cordial :-)

Nelson.-
Reply all
Reply to author
Forward
0 new messages