2017-09-02 2 views
0

Ich entwickle eine Website mit dem PHP-Framework Symfony 3.3 und der ORM-Doktrin.Viele zu viele nicht persistent

Ich habe Benutzer, und jeder Benutzer kann Dienste anbieten. Ein Dienst kann von mehr als einem Benutzer angeboten werden.

Alles funktioniert gut, außer wenn ich eine Diensteliste eines Benutzers beibehalten möchte. Nichts passiert und ich bekomme keinen Fehler. Kannst du etwas sehen, was in meinem Code falsch ist?

Meine MySQL Benutzertabelle:

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`) 
) 

Meine MySQL service_offer Tabelle:

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`) 
) 

Meine MySQL-Service-Tabelle:

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`) 
) 

Ein Teil meiner Benutzereinheit:

/** 
* @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; 
} 

Mein Service Entity-Klasse:

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

Und wenn ich das in einem Controller tue, ist nichts in der Datenbank persistierenden:

$user->setServices($services); 

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

Dieser Code:

print_r($services); 

liefert

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))) 

Und dieser Code:

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

gibt diese:

sdfgsdf 

Jede Idee?

Vielen Dank im Voraus! :)

+0

Wer hat eine Idee? –

Antwort

0

Endlich gefunden, was war das Problem !!! :) :)

Ich hatte XML-Dateien in meinem Ordner "\ src \ AppBundle \ Resources \ config \ doctrine", weil ich meine Entitätsklassen aus einer vorhandenen Datenbank generiert habe. Aber die Viele-zu-Viele-Verbindung wurde nicht automatisch generiert, also musste ich sie manuell hinzufügen.

Jedes Mal startete ich diesen Befehl ein:

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

ich die Information hatte, dass alles auf dem neuesten Stand war. Aber tatsächlich verwendete Symfony die Informationen, die in den XML-Dateien und nicht in den Anmerkungen gespeichert wurden.

So löschte ich die XML-Dateien, aktualisierte mein Schema wieder und jetzt funktioniert es. Ich habe gesehen, dass Symfony die Tabelle service_offer aktualisiert und die Spalte "id_service_offer" gelöscht hat, die eigentlich nicht benötigt wird.

1

Können Sie versuchen, die Dienste auch zu halten? Zum Beispiel:

$user->setServices($services); 

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

Thnaks für Ihre Antwort. Ich erhalte diese Fehlermeldung: Die Klasse 'Doctrine \ Common \ Collections \ ArrayCollection' wurde nicht in den konfigurierten Namespaces AppBundle \ Entity gefunden. Und ich denke, das ist normal. Wir können eine ArrayCollection nicht beibehalten. Oder? –

+0

Um ArrayCollection zu importieren, müssen Sie am Anfang Ihrer PHP-Datei möglicherweise eine 'use'-Anweisung einfügen. Versuchen Sie, diese Zeile an den Anfang Ihrer Datei zu setzen: 'Verwenden Sie Doctrine \ Common \ Collections \ ArrayCollection;'. Sieh dir das auch an um mehr über PHP Namespaces und Importieren zu erfahren: http://php.net/manual/en/language.namespaces.importing.php –

+0

Hab es schon in meiner User Klasse. Hinzugefügt in der Steuerung, aber immer noch der gleiche Fehler. Aber können wir eine Anordnung beibehalten? –