Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Concaténation de 2 objets PersistantCollection


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Concaténation de 2 objets PersistantCollection
    Bonjour,

    Voila je rencontre un petit problème avec mon code.

    ### Ce que je fais

    Je récupere les clients d'un utilisateur, puis les véhicules de chaque client. Puis j'essayes de mettre tous les véhicules dans la varable $véhicules.

    ```
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    /**
         * @Route("/", name="accueil")
         */
        public function index()
        {
          //récuperation des clients de l'utilisateur
          $clients = $this->getUser()->getClients();
          //récupération de entitymanager
          $entityManager = $this->getDoctrine()->getManager();
          //nouvelle instance de PsersistentCollection
          $vehicules = new PersistentCollection($entityManager, Vehicule::class, $vehicules = new Collection()); //erreur ici
          foreach($clients as $client)
          {
            // on ajoute toutes les vehicules de tous les clients dans l $vehicules
            $vehicules->add($client->getVehicules());
          }
            return $this->render('follo_car_service/index.html.twig', [
                'vehicules' => $vehicules,
            ]);
        }

    ```

    ### Ce que je veux

    Je recherche un moyen de concaténer 2 objets PersistantCollection mais Symfony me jete une erreur comme quoi je ne peux pas car il y a une erreur dans l'instance Collection.

    ### Ce que j'obtiens

    J'obtiens une erreur me disant que je ne peux pas instancier une Collection car il manque un statement.

  2. #2
    Modérateur

    Bonjour,

    Je ne connais pas ce que vous essyaez de faire, mais

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    $vehicules = new PersistentCollection($entityManager, Vehicule::class, $vehicules = new Collection());


    vous utilisez deux fais la variables $vehicules, une fois pour instancier votre PersistentCollection et une fois pour créer une collection, cela me semble problématique (ou pas).
    dans la doc de Doctrine on peux lire ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    __construct(EntityManagerInterface $em, ClassMetadata $class, Collection $collection)


    donc j'aurais tendance à faire ceci

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $collection = new Collection();
     //nouvelle instance de PsersistentCollection
    $vehicules = new PersistentCollection($entityManager, Vehicule::class, $collection);

  3. #3
    Membre du Club
    Erreur interface
    Bonjour et merci pour votre réponse,
    J'ai essayé sans grand espoir car il me semble que les deux code sont équivalent mais sait on jamais....enfin merci d'avoir tenté.
    J'ai la même erreur que la dernière fois qui est :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Cannot instantiate interface Doctrine\Common\Collections\Collection

    Alors avec tout hasard j'ai essayé d'implementé dans le controleur
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    use Doctrine\Common\Collections\CollectionInterface
    (qui n'existe peut être pas d'après Google.
    Même si vous n'avez que des pistes, des conseils, une idée je vous remerci de votre aide.
    C'est un projet qui me tient beaucoup à coeur étant un simpe étudiant en 1er année de DUT.

    D'autres pistes ?

    Merci

    Vincent

  4. #4
    Modérateur

    si on suit le souci ici : https://stackoverflow.com/questions/...ons-collection
    il y aurait un problème dans la façon de joindre les tables (OneToMany), à explorer.

  5. #5
    Membre du Club
    OneToMany une erreur ?
    Je ne crois pas qu'il y ait d'erreur pour la simple raison que c'est le framework symfony 4 qui l'a généré, et de souvenir je n'ai pas eu besoin d'adapter.
    Merci pour le suivi de la discusion sur stackoverflow mais cela ne répond pas totalement à ma problématique. Je suis toujours dans le flou.
    Mais en tout cas merci beaucoup de votre aide.
    Si vous avez d'autre piste je suis tout a fait preneur ?

    VIncent

  6. #6
    Modérateur

    Pouvez-vous me dire ce que retourne ce code

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    /**
         * @Route("/", name="accueil")
         */
        public function index()
        {
          //récuperation des clients de l'utilisateur
          $clients = $this->getUser()->getClients();
          //récupération de entitymanager
          $entityManager = $this->getDoctrine()->getManager();
          //nouvelle instance de PsersistentCollection
          $vehicules = new PersistentCollection($entityManager, Vehicule::class, $vehicules = new Collection());
          var_dump($vehicules);
    die();
     
        }


    Car tout ce que je lis, l'erreur ne serait pas du à l'instanciation.

  7. #7
    Membre du Club
    Même erreur
    Bonjour,
    Merci de me consacréer du temps.
    j'ai toujours la même erreur :
    Cannot instantiate interface Doctrine\Common\Collections\Collection
    Je crois que c'est le moteur de symfony qui refuse l'instance. Mais rien de sûr.
    Je continu à rechercher de mon coté.
    Une autre idée ?

    Merci Vincent

  8. #8
    Membre du Club
    Debug info
    d'après mon debugger et avec le cote précedent l ligne possant réellement le probléme pour le moteur de symfony est celle là :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $vehicules = new PersistentCollection($entityManager, Vehicule::class, $vehicules = new Collection());

    E espérant que cela puisse vous écliarer plus que moi

    Vincent

  9. #9
    Membre éprouvé

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    Cannot instantiate interface Doctrine\Common\Collections\Collection

    normal Collection étant une interface on peut pas l'instancier. Par polymorphisme tu peux remplacer Collection par ArrayCollection car cette dernière implémente Collection. Mais il se trouve que ton entité Client a défini déjà une collection de véhicules tu n'a pas besoin d'en créer une pour ajouter les véhicules. Pour récupérer la collection des véhicules associés à chaque client, il va falloir interroger ta BD en faisant une requête DQL ou query builder.

    Tu peux t'appuyer sur l'exemple de la doc symfony qui récupère un produit ainsi que sa catégorie.

  10. #10
    Membre du Club
    Parfait !
    Bonjour à tous !
    Je vous remercie tous beaucoup pour vos indications. Le probleme est resolu avec une requete DQL. Je ne sais pas si cela pourra aider mais je vais vous la fournir au cas où des débutant come mi passeront par la
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    /**
          * @return Vehicule[] Returns an array of Vehicule objects
          */
     
        public function loadVehicules($idUser)
        {
          $entityManager = $this->getEntityManager();
          $query = $entityManager->createQuery('
            SELECT v
            FROM App\Entity\Vehicule v
            WHERE v.proprietaire IN (
              SELECT c
              FROM App\Entity\Client c
              WHERE c.user = :idUser
              )
          ');
          $query->setParameter('idUser', $idUser);
          return $query->execute();
        }