We have moved our forum to GitHub Discussions. For questions about Phalcon v3/v4/v5 you can visit here and for Phalcon v6 here.

Phalcon Relationships

Hi Community,

I have a doubt about relationships, in the documentation they explain how to take advantage of relationships that are assigned in the model via hasMany y belongsTo:

$robot = Robots::findFirst(2);
foreach ($robot->robotsParts as $robotPart) {
    echo $robotPart->parts->name, "\n";
}

It works fine, but I want to do the same using Robots:find() and I'm getting an error, why?

$robot = Robots::find();
foreach ($robot->robotsParts as $robotPart) {
    echo $robotPart->parts->name, "\n";
}

Hope you can help me, thanks



16.4k

No te funciona porque un find() solo devuelve un arreglo de resultados, mientras que un findFirst devuelve un objeto

Para que tu codigo funcione debes hacer foreach(robot[0]->robotsParts as $robotPart)

Espero que te ayude

Hola Max, gracias por ayuda lo he probado y funciona bien, pero tengo otra duda como hago para mover [0], es decir quiero obtener todas las partes de TODOS los robots no de un solo robot.

Gracias.

Como te ha dicho @kaioken sería iterando $robots y $robot->robotsParts:

<?php
foreach (Robots::find() as $robot) {
    foreach ($robot->robotsParts as $robotPart) {
        echo $robotPart->parts->name, "\n";
    }
}

El problema de esto es que por cada $robot->robotsParts es una consulta más a la base de datos.

Laravel soluciona esto con eager loading y hace solamente dos consultas, pero Phalcon no tiene esta ventaja, aunque en este caso no sería difícil de implementar y ahorrar una consulta por cada Robot.

Después de Robots::find() sacas los campos que hagan referencia en RobotsParts (comunmente el id) y sacas las partes

RobotParts::query()->inWhere('id', [1, 2, 3 /* ... */])->execute();

y por último las asocias a Robots

Gracias a los dos me ha servido mucho su ayuda!