2017-09-09 35 views
1

我正在開發一個PHP框架Symfony 3.3和ORM主義的網站。Symfony 3.3 - Doctrine - Doctrine - 堅持一個連接表

我有用戶,每個用戶都可以提供服務。服務可以由多個用戶提供。

一切運作良好,除非我想堅持一個用戶的服務列表。什麼都沒有發生,我沒有得到任何錯誤。你能看到我的代碼中有什麼錯誤嗎?

我的User類(的一部分):

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

} 

我的服務類(的一部分):

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

在我的控制,我有:

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 ());」返回數據,但沒有任何內容保留在表service_offer中。任何想法?

在此先感謝。

編輯:

也試圖與指定的列,這樣的:

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

編輯2:

我service_offer MySQL表爲:

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

回答

1

嘗試指定連接表的列參數。

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

謝謝!實際上已經嘗試過。剛剛嘗試過,仍然是同樣的問題。要用你的解決方案編輯我的第一篇文章。我已經爲這個問題奮鬥了很多天了!我真的不知道如何調試,因爲沒有錯誤...你有什麼想法嗎? –

+1

我不明白你在哪裏定義$服務在功能 –

+1

我在我的代碼中有類似的實體關係,它的工作原理。也許你需要清理實體元數據並再次更新模式? –