更新01.09.2016 我更新了我的项目:我在我的实体中删除了自定义JoinColumn(现在它生成了一个,我的项目没有错误)。我决定缩短问题:
在与Symfony 2.7,Doctrine 2.7进行单向关联的ManyToOne中使用自定义命名的JoinColumn是不是很好?
我的案例是:
许多 ipGroup实体(持有多个IP地址)应与一个 ipGroupPrameters实体相关联。 (见下面的代码)
我试图运行3种变体中的代码(参见'工作流'),并得到不同的错误:
1)。没有错误,但只填写 ipGroupParams 数据库表,不在 ipGroup 表中插入任何行;
2)。 "注意:未定义的索引:ipGroupId"在vendor / doctrine / orm / lib / Doctrine / ORM / Persisters / BasicEntityPersister.php第685行
$value = $newValId[$targetClass->fieldNames[$targetColumn]];
这真的很奇怪 - $ targetClass 在fieldNames中有 ipGroupId(如调试器所示);
3)。 (在此变体中,我看起来像是更改拥有方面的关系) DBAL异常:执行' INSERT INTO ipGroup(ipGroupId,ip)VALUES(?,? )' with params [null," 134.17.26.129"] ipGroupId不能为空。 这很神奇,因为我在$ gObj上应用setIpGroupId方法,并在RAM中更新(我在调试器中看到它)。
工作流程是:
public function createIpGroup()
{
$this->createParamsObj();
$gObj = new \Bmw\StatBundle\Entity\ipGroup();
$gObj->setIpGroupId($this->groupId);
$gObj->setIp($ip);
### 1 variant
$gObj->setIpGroupParams($this->paramsObj);
### 2 variant
$gObj->setIpGroupParams($this->paramsObj);
$this->em->persist($gObj); // if not rely on cascade persist
### 3 variant
$this->paramsObj->addIpGroup($gObj);
$this->em->persist($this->paramsObj);
###
$this->em->flush();
}
public function createParamsObj()
{
$pObj = new \Bmw\StatBundle\Entity\ipGroupParams();
$this->groupId = $this->container->get('my.id.generator')->generate();
$pObj->setIpGroupId($this->groupId);
$this->em->persist($pObj);
$this->em->flush();
$this->paramsObj = $pObj;
}
这是最初的实体代码, - 然后我运行 doc:gen:entities 来自动创建getter和setter:
/**
* ipGroup
*
* @ORM\Table(
* uniqueConstraints={
* @UniqueConstraint(name="ip", columns={"ip"}),
* @UniqueConstraint(name="userId", columns={"userId"}),
* },
* indexes={@Index(name="ipGroupId", columns={"ipGroupId"})},
* )
* @ORM\Entity
*/
class ipGroup
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="ipGroupId", type="integer")
*/
private $ipGroupId;
/**
* @ORM\ManyToOne(targetEntity="ipGroupParams", inversedBy="ipGroup")
* @ORM\JoinColumn(name="ipGroupId", referencedColumnName="ipGroupId")
*/
private $ipGroupParams;
/**
* @var string
*
* @ORM\Column(name="ip", type="string", length=45, nullable=true)
*/
private $ip;
}
/**
* ipGroupParams
*
* @ORM\Table(
* uniqueConstraints={
* @UniqueConstraint(name="ipGroupId", columns={"ipGroupId"}),
* }
* )
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class ipGroupParams
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="ipGroup", mappedBy="ipGroupParams", cascade={"persist", "remove"}, orphanRemoval=TRUE)
*/
private $ipGroup;
/**
* @var integer
*
* @ORM\Column(name="ipGroupId", type="integer")
*/
private $ipGroupId;
}
答案 0 :(得分:0)
Doctrine不会自动链接这两个对象,但由于 persist 而在同一时间保存它们。这应该有效:
unset