首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 3.3 - Doctrine - Doctrine -持久化连接表

Symfony 3.3 - Doctrine - Doctrine -持久化连接表
EN

Stack Overflow用户
提问于 2017-09-09 23:30:43
回答 1查看 79关注 0票数 1

我正在开发一个使用PHP框架Symfony 3.3和ORM Doctrine的网站。

我有用户,每个用户都可以提供服务。一个服务可以由多个用户提供。

一切都运行得很好,除了我想持久化用户的服务列表。什么都没有发生,并且我没有得到任何错误。您能看到我的代码中有什么地方错了吗?

我的User类(其中一部分):

代码语言:javascript
复制
 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;
    }

}

我的Service类(部分):

代码语言:javascript
复制
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;
}

在我的控制器中,我有:

代码语言:javascript
复制
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中没有持久化任何内容。有什么想法吗?

提前谢谢。

编辑:

我还尝试指定列,如下所示:

代码语言:javascript
复制
/**
 *  
 * @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表是:

代码语言:javascript
复制
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`)
)
EN

回答 1

Stack Overflow用户

发布于 2017-09-10 00:10:48

尝试为联接表指定列参数。

代码语言:javascript
复制
/**
 *  
 * @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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46132215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档