2017-09-02 1 views
0

Je développe un site web avec le framework PHP Symfony 3.3 et la doctrine ORM.Plusieurs pour ne pas persister

J'ai des utilisateurs, et chaque utilisateur peut offrir des services. Un service peut être proposé par plusieurs utilisateurs.

Tout fonctionne bien, sauf si je veux conserver une liste de services d'un utilisateur. Rien ne se passe et je ne reçois aucune erreur. Pouvez-vous voir quelque chose qui ne va pas dans mon code?

Ma table utilisateur MySQL:

CREATE TABLE `user` (
`id_user` INT(11) NOT NULL AUTO_INCREMENT, 
`firstname` VARCHAR(255) NOT NULL, 
`surname` VARCHAR(255) NOT NULL, 
`address` VARCHAR(255) NOT NULL, 
`zip` VARCHAR(4) NOT NULL, 
`city` VARCHAR(255) NOT NULL, 
`phone_number` VARCHAR(12) NULL DEFAULT NULL, 
`mobile_number` VARCHAR(12) NULL DEFAULT NULL, 
`email` VARCHAR(255) NOT NULL, 
`password` VARCHAR(255) NOT NULL, 
`birth_date` DATE NOT NULL, 
`is_verified` TINYINT(4) NULL DEFAULT NULL, 
`id_gender` INT(11) NOT NULL, 
PRIMARY KEY (`id_user`), 
UNIQUE INDEX `e-mail_UNIQUE` (`email`), 
UNIQUE INDEX `id_utilisateur_UNIQUE` (`id_user`), 
INDEX `fk_id_gender_idx` (`id_gender`), 
CONSTRAINT `fk_id_gender` FOREIGN KEY (`id_gender`) REFERENCES `gender`   (`id_gender`) 
) 

Mon MySQL table service_offer:

CREATE TABLE `service_offer` (
`id_service_offer` INT(11) NOT NULL AUTO_INCREMENT, 
`id_user` INT(11) NOT NULL, 
`id_service` INT(11) NOT NULL, 
PRIMARY KEY (`id_service_offer`), 
UNIQUE INDEX `id_user_UNIQUE` (`id_user`), 
INDEX `fk_service_idx` (`id_service`), 
CONSTRAINT `fk_service` FOREIGN KEY (`id_service`) REFERENCES `service` (`id_service`), 
CONSTRAINT `fk_user` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`) 
) 

Ma table de service MySQL:

CREATE TABLE `service` (
`id_service` INT(11) NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(255) NOT NULL, 
`description` VARCHAR(255) NULL DEFAULT NULL, 
PRIMARY KEY (`id_service`), 
UNIQUE INDEX `id_service_UNIQUE` (`id_service`) 
) 

Une partie de mon entité utilisateur:

/** 
* @var integer 
* 
* @ORM\Column(name="id_user", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
private $idUser; 

/** 
* 
* @ORM\ManyToMany(targetEntity="Service") 
* @ORM\JoinTable(name="service_offer", 
*  joinColumns={@ORM\JoinColumn(name="id_user", referencedColumnName="id_user")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="id_service", referencedColumnName="id_service")} 
*  ) 
*/ 
private $services; 

function getServices() { 
    return $this->services; 
} 

function setServices($services) { 
    $this->services = $services; 
    return $this; 
} 

Mon entité de service Classe:

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Service 
* 
* @ORM\Table(name="service", uniqueConstraints={@ORM\UniqueConstraint(name="id_service_UNIQUE", columns={"id_service"})}, indexes={@ORM\Index(name="fk_user_idx", columns={"user"})}) 
* @ORM\Entity 
*/ 
class Service 
{ 
/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255, nullable=false) 
*/ 
private $name; 

/** 
* @var string 
* 
* @ORM\Column(name="description", type="string", length=255, nullable=true) 
*/ 
private $description; 

/** 
* @var integer 
* 
* @ORM\Column(name="id_service", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
private $idService; 



/** 
* Set name 
* 
* @param string $name 
* 
* @return Service 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

/** 
* Get name 
* 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Set description 
* 
* @param string $description 
* 
* @return Service 
*/ 
public function setDescription($description) 
{ 
    $this->description = $description; 

    return $this; 
} 

/** 
* Get description 
* 
* @return string 
*/ 
public function getDescription() 
{ 
    return $this->description; 
} 

/** 
* Get idService 
* 
* @return integer 
*/ 
public function getIdService() 
{ 
    return $this->idService; 
} 
} 

Et si je le fais dans un contrôleur, rien ne persiste dans la base de données:

$user->setServices($services); 

$em->persist($user); 
$em->flush(); 

Ce code:

print_r($services); 

renvoie

Doctrine\Common\Collections\ArrayCollection Object ([elements:Doctrine\Common\Collections\ArrayCollection:private] => Array ([0] => AppBundle\Entity\Service Object ([name:AppBundle\Entity\Service:private] => sdfgsdf [description:AppBundle\Entity\Service:private] => sdfgsdf [idService:AppBundle\Entity\Service:private] => 2))) 

Et ce code:

echo $services[0]->getName(); 

renvoie cette:

sdfgsdf 

Toute idée?

Merci d'avance! :)

+0

Quelqu'un a une idée? –

Répondre

0

enfin trouvé quel était le problème !!! :) :)

J'avais des fichiers XML dans mon dossier "\ src \ AppBundle \ Resources \ config \ doctrine" car j'ai généré mes classes d'entités à partir d'une base de données existante. Mais la jointure Many to many n'était pas générée automatiquement, je devais donc l'ajouter manuellement.

Chaque fois que je lançais cette commande:

php bin/console doctrine:schema:update --force 

J'ai eu l'information que tout était à jour. Mais en fait, Symfony a utilisé les informations stockées dans les fichiers XML et non dans les annotations ...

J'ai donc supprimé les fichiers XML, mis à jour mon schéma et maintenant ça marche. J'ai vu que Symfony a mis à jour la table service_offer et supprimé la colonne "id_service_offer" qui n'est en fait pas nécessaire.

1

Pouvez-vous essayer de maintenir les services aussi? Par exemple:

$user->setServices($services); 

$em->persist($user); 
$em->persist($services); 
$em->flush(); 
+0

Thnaks pour votre réponse. Je reçois ce message d'erreur: La classe 'Doctrine \ Common \ Collections \ ArrayCollection' n'a pas été trouvée dans les espaces de noms configurés en chaîne AppBundle \ Entity. Et je pense que c'est normal. Nous ne pouvons pas conserver une ArrayCollection. Ou? –

+0

Vous devrez peut-être inclure une instruction 'use' en haut de votre fichier PHP pour importer ArrayCollection. Essayez de placer cette ligne en haut de votre fichier: 'use Doctrine \ Common \ Collections \ ArrayCollection;'. Voir aussi ceci pour plus d'informations sur les espaces de noms PHP et l'importation: http://php.net/manual/fr/language.namespaces.importing.php –

+0

L'avoir déjà dans ma classe User. Ajouté dans le contrôleur, mais toujours la même erreur. Mais pouvons-nous persister un tableau? –