Php 具有自定义列名称的条令中的多个ORM关联

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

更新2016年9月1日我更新了我的项目:我在我的实体中去掉了自定义JoinColumn(现在它生成了一个,我的项目工作时没有错误)。我决定缩短这个问题:

在与Symfony 2.7、条令2.7的多通单向关联中使用自定义命名的JoinColumn是一个好主意吗

我的情况是:


多个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();
}