为什么反面的 ID 没有被添加到 Doctrine 2 一对多关系中的拥有方?

Why is the ID of the inverse side not being to added to the owning side in Doctrine 2 One to Many relationship?

我创建了两个 类 WebsiteWebsiteDomain。一个网站可以有多个域,所以我在 类.

的注释中设置了 OneToMany 关系

Website.php

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;

/**
 * Website object for the chosen site
 *
 * @ORM\Entity
 * @ORM\Table(name="websites")
 */
class Website
{

    /**
     * @JMS\Type("integer")
     *
     * @ORM\Id
     * @ORM\Column(type="integer", nullable=false)
     * @ORM\GeneratedValue
     *
     * @var integer $id
     */
    protected $id;

    /**
     * Domains that this website answers on
     *
     * @JMS\Type("ArrayCollection<Turtle\Model\Entity\WebsiteDomain>")
     * @ORM\OneToMany(targetEntity="WebsiteDomain", mappedBy="website", cascade={"persist", "remove"})
     *
     * @var WebsiteDomain
     */
    private $domains;

}

WebsiteDomain.php

use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;

/**
 * Website object for the chosen site
 *
 * @ORM\Entity
 * @ORM\Table(name="website_domains")
 */
class WebsiteDomain
{

    /**
     * @JMS\Type("integer")
     *
     * @ORM\Id
     * @ORM\Column(type="integer", nullable=false)
     * @ORM\GeneratedValue
     *
     * @var integer $id
     */
    protected $id;

    /**
     * Website that this domain belongs to
     *
     * @JMS\Type("Website")
     * @ORM\ManyToOne(targetEntity="Website", inversedBy="domains")
     *
     * @var \Turtle\Model\Entity\Website
     */
    private $website;

}

现在,当我创建一个附加了多个域的新网站时,所有记录都在相关的 table 中创建,但是域所属的 webiste_id 是 NULL。

| id | name    | description    | parent | storageName |
|----|---------|----------------|--------|-------------|
| 1  | foo_bar | FooBar Website |        | foo_bar     |

| id | website_id | domain       | primary | 
|----|------------|--------------|---------|
| 1  | NULL       | foobar.co.uk | 1       |

与第一个table中的网站相关的最后一个table中的website_id应该为空。

我知道这个问题已经在这里被问过很多次了,但我找不到答案。我玩过不同的 PDO 驱动程序,SQL 和 MySQL 并且都表现出同样的问题。

我正在使用以下对象创建记录。我唯一能想到的是 WebsiteDomain 中的 website_id 设置为 null,但如果是这种情况,我怎样才能让 Doctrine 覆盖这个值?

object(Turtle\Model\Entity\Website)#412 (10) {
  ["name":"Turtle\Model\Entity\Website":private]=>
  string(7) "foo_bar"
  ["displayName":"Turtle\Model\Entity\Website":private]=>
  string(7) "Foo Bar"
  ["description":"Turtle\Model\Entity\Website":private]=>
  string(14) "FooBar Website"
  ["parent":"Turtle\Model\Entity\Website":private]=>
  NULL
  ["domains":"Turtle\Model\Entity\Website":private]=>
  object(Doctrine\Common\Collections\ArrayCollection)#410 (1) {
    ["elements":"Doctrine\Common\Collections\ArrayCollection":private]=>
    array(1) {
      [0]=>
      object(Turtle\Model\Entity\WebsiteDomain)#371 (7) {
        ["website":"Turtle\Model\Entity\WebsiteDomain":private]=>
        NULL
        ["domain":"Turtle\Model\Entity\WebsiteDomain":private]=>
        string(12) "foobar.co.uk"
        ["primary":"Turtle\Model\Entity\WebsiteDomain":private]=>
        bool(true)
        ["id":protected]=>
        NULL
        ["created":protected]=>
        NULL
        ["modified":protected]=>
        NULL
        ["admupdated":protected]=>
        bool(false)
      }
    }
  }
  ["storageName":"Turtle\Model\Entity\Website":private]=>
  string(7) "foo_bar"
  ["id":protected]=>
  NULL
  ["created":protected]=>
  NULL
  ["modified":protected]=>
  NULL
  ["admupdated":protected]=>
  bool(false)
}

正在使用 JMS 序列化程序从数组反序列化此对象。

不胜感激。

通常在使用 Doctrine 时,当我忘记在父实体的 addChild 方法中为子实体设置父实体时,我已经看到了这种情况。

专门针对您的示例,该示例位于 Website 实体的 addDomain 方法中。默认情况下,它将是这样的:

public function addDomain (WebsiteDomain $domain) {
     $this->domains[] = $domain;
     return $this;
}

但您需要在该方法中显式设置父项。

public function addDomain (WebsiteDomain $domain) {
     $domain->setWebsite($this);
     $this->domains[] = $domain;
     return $this;
}

级联注释似乎会自动执行此操作,但实际上不会。

我不确定这在您的设置中是否有必要。这可能与您遇到的问题不同,因为我不熟悉您使用的某些工具,但我认为值得一试。