El tema es el siguiente, tengo dos entidades de Doctrine relacionadas entre si, una que es Profile y otra que es Specialty.
- Profile tiene una relación Many To Many con Specialty.
- Specialty tiene una relación One To Many con si misma (Self-Referencing). (Dejo abajo los Entities)
Con esta estructura, las Specialties se guardan así:
Código:
Y los Profiles se guardan así:id parent_id specialty -- -- -- 1 null Specialty Parent 2 1 Specialty Children 3 1 Specialty Children 4 null Specialty Parent 5 4 Specialty Children 6 4 Specialty Children 7 4 Specialty Children 8 4 Specialty Children //....
Código:
El planteamiento es seleccionar solo las Especialidades padre y contar todos los perfiles asociados, incluyendo también todos los perfiles de las especialidades hijas.profile_id specialty_id -- -- 1 1 1 2 2 1 2 2 2 3 //....
Con esta consulta consigo obtener todos los registros.
Código PHP:
$dql = '';
$dql .= 'SELECT s1, pro1, COUNT(pro1.id) as numProfiles ';
$dql .= 'FROM \Resources\Entity\Specialty s1 ';
$dql .= 'LEFT JOIN s1.parent p1 ';
$dql .= 'LEFT JOIN s1.profiles pro1 ';
$dql .= 'GROUP BY s1.id, pro1.id';
Código:
Y si condiciono la selección para que tome solo las Especialidades Padrearray (size=811) 0 => array (size=2) 0 => array (size=10) 'id' => int 1 'title' => string 'Title' (length=5) 'value' => string 'value' (length=5) 'profiles' => array (size=1) 0 => array (size=27) 'id' => int 1 'firstName' => string 'name' (length=5) 1 => array (size=27) 'id' => int 1 'firstName' => string 'name' (length=5) 'numProfiles' => string '1' (length=1) 1 => array (size=2) 0 => array (size=10) 'id' => int 1 'title' => string 'Title' (length=5) 'value' => string 'value' (length=5) 'profiles' => array (size=1) 0 => array (size=27) 'id' => int 1 'firstName' => string 'name' (length=5) 1 => array (size=27) 'id' => int 1 'firstName' => string 'name' (length=5) 'numProfiles' => string '1' (length=1)
Código PHP:
$dql = '';
$dql .= 'SELECT s1, pro1, COUNT(pro1.id) as numProfiles ';
$dql .= 'FROM \Resources\Entity\Specialty s1 ';
$dql .= 'LEFT JOIN s1.parent p1 ';
$dql .= 'LEFT JOIN s1.profiles pro1 ';
$dql .= 'WHERE s1.parent IS NULL ';
$dql .= 'GROUP BY s1.id, pro1.id';
En fin, que llevo todo el fin de semana haciendo pruebas y no he conseguido aplicar la lógica correctamente para sacarlo.
Imagino que a alguien se le habrá presentado una situación similar, o algo de orientación se agradecería.
Gracias de antemano y saludos a todos.
PD.: Dejo por aquí las Entidades.
Los Entities
Código PHP:
/**
* @ORM\Entity
* @ORM\Table(name="profiles")
*/
class Profile
{
/**
* @ORM\ManyToMany(targetEntity="Specialty", inversedBy="profiles")
* @ORM\JoinTable(name="mtm_profile_specialty")
*/
private $specialties;
}
Código PHP:
/**
* @ORM\Entity
* @ORM\Table(name="specialties")
*/
class Specialty
{
/**
* @ORM\OneToMany(targetEntity="Specialty", mappedBy="parent")
*/
private $children;
/**
* @ORM\ManyToOne(targetEntity="Specialty", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
*/
private $parent;
/**
* @ORM\ManyToMany(targetEntity="Profile", mappedBy="specialties")
*/
private $profiles;
}