多对多不坚持

Many to many doesn't persist

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

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

一切正常,除非我想保留用户的服务列表。没有任何反应,我也没有收到任何错误。你能看出我的代码有什么问题吗?

我的 MySQL 用户 table:

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

我的MySQLservice_offertable:

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

我的 MySQL 服务 table:

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

我的用户实体的一部分:

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

我的服务实体class:

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

如果我在控制器中执行此操作,数据库中不会保留任何内容:

$user->setServices($services);

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

此代码:

print_r($services);

returns

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

还有这段代码:

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

returns这个:

sdfgsdf

有什么想法吗?

提前致谢! :)

您也可以尝试持久化服务吗?例如:

$user->setServices($services);

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

终于找到问题所在了!!! :) :)

我的“\src\AppBundle\Resources\config\doctrine”文件夹中有 XML 个文件,因为我从现有数据库生成了实体 类。但是多对多连接不是自动生成的,所以我必须手动添加它。

每次我启动这个命令时:

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

我得到的信息是一切都是最新的。但实际上,Symfony 使用存储在 XML 文件中的信息,而不是注释中的信息....

所以,我删除了 XML 文件,再次更新了我的架构,现在它可以正常工作了。我看到 Symfony 更新了 table service_offer 并删除了实际上不需要的列 "id_service_offer"。