Php 具有自定义列名称的条令中的多个ORM关联
更新2016年9月1日我更新了我的项目:我在我的实体中去掉了自定义JoinColumn(现在它生成了一个,我的项目工作时没有错误)。我决定缩短这个问题: 在与Symfony 2.7、条令2.7的多通单向关联中使用自定义命名的JoinColumn是一个好主意吗 我的情况是:Php 具有自定义列名称的条令中的多个ORM关联,php,symfony,orm,doctrine,model-associations,Php,Symfony,Orm,Doctrine,Model Associations,更新2016年9月1日我更新了我的项目:我在我的实体中去掉了自定义JoinColumn(现在它生成了一个,我的项目工作时没有错误)。我决定缩短这个问题: 在与Symfony 2.7、条令2.7的多通单向关联中使用自定义命名的JoinColumn是一个好主意吗 我的情况是: 多个ipGroup实体(拥有多个ip地址)应与一个ipGroupPrameters实体关联。(见下面的代码) 我尝试在3个变体中运行代码(请参见“工作流”),并得到不同的错误: 1) 。无错误,但仅填写ipGroupPar
多个ipGroup实体(拥有多个ip地址)应与一个ipGroupPrameters实体关联。(见下面的代码)
我尝试在3个变体中运行代码(请参见“工作流”),并得到不同的错误: 1) 。无错误,但仅填写ipGroupParams DB表,未在ipGroup表中插入任何行 2) 。第685行的vendor/doctrine/orm/lib/doctrine/orm/Persisters/basicnitypersister.php中的“注意:未定义索引:ipGroupId” 这真的很奇怪-$targetClass在字段名中有ipGroupId(如调试器所示) 3) 。(在此变体中,看起来我更改了关系的拥有方)DBAL异常:执行“插入ipGroup(ipGroupId,ip)值(?)”时发生异常,参数[null,“134.17.26.129”]ipGroupId不能为null。 这很神奇,因为我在$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;
}
条令不会自动链接两个对象,但由于存在持久性,会同时保存它们。这应该是可行的:
public function createIpGroup()
{
$this->createParamsObj();
$gObj = new \Bmw\StatBundle\Entity\ipGroup();
$gObj->setIpGroupId($this->groupId);
$gObj->setIp($ip);
$gObj->setIpGroupParams($this->paramsObj);
$this->paramsObj->addIpGroup($gObj);
$this->em->persist($gObj);
$this->em->flush();
}
条令不会自动链接两个对象,但由于存在持久性,会同时保存它们。这应该是可行的:
public function createIpGroup()
{
$this->createParamsObj();
$gObj = new \Bmw\StatBundle\Entity\ipGroup();
$gObj->setIpGroupId($this->groupId);
$gObj->setIp($ip);
$gObj->setIpGroupParams($this->paramsObj);
$this->paramsObj->addIpGroup($gObj);
$this->em->persist($gObj);
$this->em->flush();
}
Dumb问题:您生成了实体的setter和getter吗?是的,@GeraldChablowski,getter/setters生成的代码请参见Dumb问题:您生成了实体的setter和getter吗?是的,@GeraldChablowski,getter/setters生成的代码请参见,谢谢,但它不起作用-就像variant2一样。我还假设,由于ipGroupParams实体中的@OneToMany(…,cascade={“persist”,“remove”},…)符号,持久化会自动发生……我已经编辑了它并添加了$gObj->setIpGroupId($this->groupId);。现在应该可以了。对不起,@GeraldChablowski,但你没有添加任何行,你只是将第2和第3个变量组合在一起。对不起,我没有帮你。因为正常情况下,它应该会起作用。谢谢,但它不起作用——就像variant2一样。我还假设,由于ipGroupParams实体中的@OneToMany(…,cascade={“persist”,“remove”},…)符号,持久化会自动发生……我已经编辑了它并添加了$gObj->setIpGroupId($this->groupId);。现在应该可以了。对不起,@GeraldChablowski,但你没有添加任何行,你只是将第2和第3个变量组合在一起。对不起,我没有帮你。因为正常情况下,它应该会起作用。
public function createIpGroup()
{
$this->createParamsObj();
$gObj = new \Bmw\StatBundle\Entity\ipGroup();
$gObj->setIpGroupId($this->groupId);
$gObj->setIp($ip);
$gObj->setIpGroupParams($this->paramsObj);
$this->paramsObj->addIpGroup($gObj);
$this->em->persist($gObj);
$this->em->flush();
}