2017-09-09 4 views
1

Ich entwickle eine Webseite mit dem PHP Framework Symfony 3.3 und der ORM Doctrine.Symfony 3.3 - Lehre - Lehre - Fortbestehen mit einer Join Tabelle

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 Benutzerklasse (ein Teil davon):

class User implements AdvancedUserInterface, \Serializable 
{ 

    public function __construct(){ 
     $this->services = new ArrayCollection(); // Services offered by the user 
    } 

    /** 
    * 
    * @var Doctrine\Common\Collections\ArrayCollection $services 
    * 
    * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Service", inversedBy="users") 
    * @ORM\JoinTable(name="service_offer") 
    * 
    */ 

    private $services; 

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

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

} 

Mein Service-Klasse (ein Teil davon):

class Service 
{ 

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

    /** 
    * @var \Doctrine\Common\Collections\ArrayCollection $users 
    * 
    * @ManyToMany(targetEntity="AppBundle\Entity\User", mappedBy="services") 
    * 
    **/ 
    private $users; 
} 

In meinem Controller, ich habe:

class ServiceOfferController extends Controller { 
/** 
* 
* @param EntityManagerInterface $em 
* 
* 
* @Route("/member/ServiceOffer", name="ServiceOffer") 
*/ 
public function serviceOfferAction(Request $request, EntityManagerInterface $em){ 

    //$user = $this->getUser(); 
    $form = $this->createForm(ServiceOfferType::class); 

    $form->handleRequest($request); 

    if ($form->isSubmitted()){ 
     // Services ticked in the formular 
     $services = $form->get('services')->getData(); 

     $user = $this->getUser(); 

     $user->setServices($services); 

     print_r($user->getServices()); 

     // Persisting in the DB 
     $em->persist($user); 
     $em->flush(); 
    } 

    return $this->render('serviceOffer.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

}

"print_r ($ user-> getServices()) gibt mir Daten zurück, aber nichts ist in der Tabelle service_offer vorhanden. Irgendeine Idee?

Vielen Dank im Voraus.

EDIT:

auch versucht, mit den Spalten spezifiziert, wie folgt aus:

/** 
* 
* @var Doctrine\Common\Collections\ArrayCollection $services 
* 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Service", inversedBy="users") 
* @ORM\JoinTable(name="service_offer", 
* joinColumns={ 
*  @ORM\JoinColumn(name="id_user", referencedColumnName="id_user", onDelete="CASCADE") 
* }, 
* inverseJoinColumns={ 
*  @ORM\JoinColumn(name="id_service", referencedColumnName="id_service", onDelete="CASCADE") 
* } 
*) 
* 
*/ 
private $services; 

EDIT 2:

Meine service_offer MySQL-Tabelle ist:

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

Antwort

1

Versuchen angeben Spaltenparameter für die Join-Tabelle.

/** 
* 
* @var Doctrine\Common\Collections\ArrayCollection $services 
* 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Service", inversedBy="users") 
* @ORM\JoinTable(name="user_service", 
* joinColumns={ 
*  @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE") 
* }, 
* inverseJoinColumns={ 
*  @ORM\JoinColumn(name="offer_id", referencedColumnName="id", onDelete="CASCADE") 
* } 
*) 
* 
*/ 

private $services; 
+0

Vielen Dank! Schon versucht, eigentlich. Habe es gerade versucht, und immer noch das gleiche Problem. Ich werde meinen ersten Beitrag mit Ihrer Lösung bearbeiten. Ich kämpfe schon seit vielen Tagen mit diesem Thema !! Ich kann nicht wirklich debuggen, da es keinen Fehler gibt ... Hast du eine Idee? –

+1

Ich sehe nicht, wo definieren Sie $ Dienste in Funktion –

+1

Ich habe ähnliche Entity-Beziehungen in meinem Code und es funktioniert. Vielleicht müssen Sie Entitätsmetadaten bereinigen und das Schema erneut aktualisieren? –