Doctrine中的ManyToOne ORM关联与自定义JoinColumn名称

时间:2016-08-19 18:38:42

标签: php symfony orm doctrine model-associations

更新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;
}

1 个答案:

答案 0 :(得分:0)

Doctrine不会自动链接这两个对象,但由于 persist 而在同一时间保存它们。这应该有效:

unset