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;
} 
    
 

