Mon idée première est qu'en principe si tes formulaires sont bien construits, tu n'as strictement rien besoin de faire de ce coté.
Dans ton cas, c'est un schema classique : un premier formulaire DossierType dans lequel ton builder embarque un widget 'collection', et le type de la collection sera ton UserType.
C'est l'entité que tu vas passer à ton formulaire qui devra être triée. C'est à dire qu'au moment ou dans ton contrôleur tu auras cette ligne :
$objForm = $this->createForm(new DossierType (), $objDossier);
il faudra que ton $objDossier possède déja la collection triée d'utilisateurs, ce qui signifie faire la requête soi-même avec les jointures et ne pas utiliser le lazy-loading. Si tu récupères ton dossier en faisant par exemple un simple
$objEm->getRepository("Blablabla:Dossier")->find($id);
tu vas récupérer ton Dossier mais au moment ou tu voudras afficher la collection, Doctrine devra faire une requête supplémentaire pour récupérer tes utilisateurs associés : à ce moment la requête ne filtrera rien du tout et récupèrera tous tes utilisateurs.
Par contre, si tu effectues toi même la requête pour récupérer ton Dossier, et que dans cette requête tu joins l'entité utilisateur et que tu filtres ce que tu veux, non seulement lors de la génération de la collection de formulaires, tu n'auras pas besoin d'une requête supplémentaire car tes utilisateurs seront déjà chargés, mais en plus cette collection ne contiendra que ceux que tu auras toi même filtré dans cette requête.
$objEm->getRepository("Blablabla:Dossier")->findOneWithExpertUser($id); // méthode custom qui retourne l'entité dossier et la collection triée d'utilisateurs associée
Pour résumer : explicite la méthode qui récupère le dossier en y joignant les utilisateurs filtrés, et garde le fonctionnement le plus générique possible pour ton formulaire.
++
Partager