Partage
  • Partager sur Facebook
  • Partager sur Twitter

Je n'arrive pas a récupérer une relation Symfony 5

Relation Doctrine OneToMany

    15 mai 2022 à 21:07:51

    Bonjour sur mon projet symfony 5+ jai créer une entité user et une entité company (un user peut avoir plusieurs companies   OneToMany)


    j'ai donc ajouter une company a mon entité user, jusque là tous va bien dans ma BDD la relation y est présente.


    Mais quand j'ai voulu récupéré mon entité company a mon user courant j’obtiens un arrayCollection vide.


    J'ai testé de faire l'inverse : de récupérer l'user par l'objet id d'une company pour voir si la relation y est présente et là j'obtiens l'objet user..


    donc je pense que la relation est là mais que je n'arrive pas a récupérer l'objet .

    Entité User:

    <?php
    
    namespace App\Entity;
    
    use Cassandra\Exception\ValidationException;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    
    use App\Repository\UserRepository;
    use Stringable;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    use Symfony\Component\Validator\Constraints\Unique;
    use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
    use Symfony\Component\Validator\Exception\RuntimeException;
    
    /**
     * @ORM\Entity(repositoryClass=UserRepository::class)
     * @UniqueEntity("email", message="Cette adresse email n'est pas valide")
     * @UniqueEntity("phone", message="Ce numéro n'est pas valide")
     * @UniqueEntity("username", message="Ce nom d'utilisateur est déjà pris")
     * 
     */
    class User implements UserInterface, PasswordAuthenticatedUserInterface
    {
        /**
         * @var array|string[]
         */
        public static array $rolesUserList = ['ROLE_USER','ROLE_ADMIN'];
        /**
         * @var int
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         */
        private int $id;
    
        /**
         * @var string
         * @ORM\Column(type="string", length=180, unique=true)
         * @Assert\NotBlank(message="l'adresse email doit être saisi")
         * @Assert\Email(message="Cette adresse email n'est pas valide")
         */
        private string $email;
    
        /**
         * @var array<string>
         * @ORM\Column(type="json")
         * 
         */
        private array $roles = [];
    
        /**
         * @var string
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="Le nom d'utilisateur doit être saisi")
         *
         *
         */
        private string $username;
    
        /**
         * @var string The hashed password
         * @ORM\Column(type="string")
         * @ORM\Column(type="string")
         *
         *
         */
        private string $password;
    
        /**
         * @var string|null
         * @ORM\Column(type="string", length=255, nullable=true)
         *
         */
        private ?string $name;
    
        /**
         * @var string|null
         * @ORM\Column(type="string", length=255, nullable=true)
         *
         */
        private ?string $firstName;
    
        /**
         * @var string|null
         * @ORM\Column(type="string", length=255, nullable=true)
         *
         */
        private ?string $birth;
    
        /**
         * @var string|null
         * @ORM\Column(type="string", length=255, nullable=true)
         * @Assert\Regex(pattern = "/^(?:(?:\+|00)33|0)\s*[1-9](?:[\s.-]*\d{2}){4}$/", 
         *               message = "le numéro de téléphone saisit n'est pas valide")
         */
        private ?string $phone;
    
        /**
         * @var string|null
         * @ORM\Column(type="string", length=255, nullable=true)
         * 
         * 
         */
        private ?string $profilImage;
    
        /**
         * @var string
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank()
         */
        private string $gender;
    
        /**
         * @var \DateTimeImmutable
         * @ORM\Column(type="datetime_immutable")
         */
        private \DateTimeImmutable $createdAt;
    
        /**
         * @var bool
         * @ORM\Column(type="boolean" )
         */
        private bool $isVerified = false;
    
        /**
         * @var string|null
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private ?string $registrationToken;
    
        /**
         * @var \DateTimeImmutable|null
         * @ORM\Column(type="datetime_immutable", nullable=true)
         */
        private ?\DateTimeImmutable $accountMustBeVerifiedBefore;
    
        /**
         * @var \DateTimeImmutable|null
         * @ORM\Column(type="datetime_immutable", nullable=true)
         */
        private ?\DateTimeImmutable $accountVerifiedAt;
    
        /**
         * @var bool
         * @ORM\Column(type="boolean")
         */
        private bool $passwordModified = false;
    
        /**
         * @var \DateTimeImmutable|null
         * @ORM\Column(type="datetime_immutable", nullable=true)
         */
        private ?\DateTimeImmutable $passwordModifiedAt;
    
        /**
         * @var string|null
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private string|null $forgotPasswordToken;
    
        /**
         * @var \DateTimeImmutable|null
         * @ORM\Column(type="datetime_immutable", nullable=true)
         */
        private ?\DateTimeImmutable $forgotPasswordMustBeVerifiedBefore;
    
        /**
         * @var \DateTimeImmutable|null
         * @ORM\Column(type="datetime_immutable", nullable=true)
         */
        private ?\DateTimeImmutable $ForgotPasswordRequestedAt;
    
        /**
         * @var string|null
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private ?string $googleID;
    
        /**
         * @var string|null
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private ?string $githubID;
    
        /**
         * @ORM\OneToMany(targetEntity=Company::class, mappedBy="user")
         */
        private $companies;
    
        /**
         * @ORM\OneToMany(targetEntity=Notices::class, mappedBy="user")
         */
        private $notices;
    
    
    
    
        public function __construct(){
            $this->profilImage = '/uploads/profil_image_default/user_profil_image_default.jpg';
            $this->companies = new ArrayCollection();
            $this->notices = new ArrayCollection();
        }
    
        



    entité Company :

    <?php
    
    namespace App\Entity;
    
    use App\Repository\CompanyRepository;
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\Common\Collections\Collection;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(repositoryClass=CompanyRepository::class)
     * @UniqueEntity("SIRETNumber", message="Ce numéro SIRET n'est pas valide")
     */
    class Company
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\ManyToOne(targetEntity=user::class, inversedBy="companies")
         */
        private $user;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="Le Nom de l'entreprise doit être saisi.")
         */
        private $nameOfCompany;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\Regex(pattern = "/^\d{14}$/", message = "Le numéro SIRET inscrit n'est pas valide")
         * @Assert\NotBlank(message="Le numéro SIRET doit être saisi.")
         */
        private $SIRETNumber;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="Le nom et prenom du ou des responsable doit être saisi.")
         */
        private $nameOfCompanyManager;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="Le nom et prenom du ou des responsable doit être saisi.")
         */
        private $firstnameOfCompanyManager;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="Le secteur d'activité doit être saisi.")
         */
        private $sector;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $specialization;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="L'année de debut d'activité La zone maximal d'activité doit être saisi.")
         */
        private $inActivitySince;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $address;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $department;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="La ville de l'entreprise doit être saisi.")
         */
        private $city;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="Le code postal doit être saisi.")
         */
        private $postalCode;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="La zone maximal d'activité doit être saisi.")
         */
        private $areaActivity;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="Le Titre lié a votre entreprise doit être saisi.")
         */
        private $profileTitle;
    
        /**
         * @ORM\Column(type="string", length=255)
         * @Assert\NotBlank(message="La description doit être saisi.")
         */
        private $profileDescription;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $profileImage;
    
        /**
         * @ORM\Column(type="simple_array", nullable=true)
         */
        private $images = [];
    
        /**
         * @ORM\Column(type="integer")
         */
        private $generalNotice;
    
        /**
         * @ORM\Column(type="integer")
         */
        private $qualityNotice;
    
        /**
         * @ORM\Column(type="integer")
         */
        private $speedNotice;
    
        /**
         * @ORM\Column(type="integer")
         */
        private $priceNotice;
    
        /**
         * @ORM\OneToMany(targetEntity=Notices::class, mappedBy="company")
         */
        private $notices;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $phone;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $email;
    
        public function __construct()
        {
            $this->notices = new ArrayCollection();
            $this->generalNotice = 0;
            $this->qualityNotice = 0;
            $this->speedNotice = 0;
            $this->priceNotice = 0;
        }


    dans le controller pour ajouter une nouvelle company :

    if($addCompanyForm->isSubmitted() && $addCompanyForm->isValid())
           {
    
               $profileImage = $saveImages->formateAndSaveImage(
                   $addCompanyForm->get('profileImage')->getData(),
                   $this->getParameter('app.company_profile_image_directory'),
                   $this->getParameter('app.company_profile_image_directory_render'));
    
               $images = $this->uniteImages($addCompanyForm, $saveImages);
    
               $company->setProfileImage($profileImage);
               $company->setImages($images);
    
    
               $company->setUser($this->getUser());
               $this->getUser()->addCompany($company);
               $manager->persist($company);
               $manager->flush();
           }
            return $this->render('addCompany.html.twig',['addCompanyForm' => $addCompanyForm->createView()]);
        }



    j'essaye de récupérer l'objet company :

    class UserCompaniesDashboardController extends AbstractController
    {
        #[Route('/espace-entreprise', name: 'user_companies_dashboard')]
        public function index(Request $request, ): Response
        {
    
    
           $company =  $this->getUser()->getCompanies();
            dd($company);
    
    



    le résultat :



    -
    Edité par b-init 15 mai 2022 à 21:11:38

    • Partager sur Facebook
    • Partager sur Twitter
      16 mai 2022 à 15:52:26

      Bonjour,

      As tu essayé d'itérer avec par exemple un foreach sur ta variable $company (ce devrait d'ailleurs être $companies compte-tenu de ta relation) ?

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        17 mai 2022 à 19:05:47

        Oui merci en fesant une boucle for j'arrive a récupérer les donnée , mais je ne comprend pas pourquoi on ne peut pas faire un  dd(); directement sur un array collection ?

        bin je pense que c'est a la creation de l'entité il ma créer la fonction getCompanies().

        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2022 à 7:26:33

          Ton dd fonctionne sauf que pour optimiser Doctrine ne récupère pas le array collection lors du dd. Il te faut faire comme je te l'ai indiqué une itération.

          Pour le reste tu ne sembles pas avoir compris : ce n'est pas sur le getter que je modifie ton code bien-sûr mais sur le fait que tu nommes ta variable résultante au singulier or comme c'est une collection d'objets ce devrait être au pluriel. Cela semble du chipotage mais en regardant juste la variable suivant son nommage tu sais ainsi si c'est un objet ou une collection d'objet.

          Le code proposé :

          class UserCompaniesDashboardController extends AbstractController
          {
              #[Route('/espace-entreprise', name: 'user_companies_dashboard')]
              public function index(Request $request, ): Response
              {
           
           
                 $companies =  $this->getUser()->getCompanies();
                  dd($companies);

          Et si ton sujet est terminé, passe en résolu.

          A+ ou bye

          -
          Edité par monkey3d 18 mai 2022 à 8:00:42

          • Partager sur Facebook
          • Partager sur Twitter

          Je n'arrive pas a récupérer une relation Symfony 5

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown