为什么反面的 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?
我创建了两个 类 Website
和 WebsiteDomain
。一个网站可以有多个域,所以我在 类.
的注释中设置了 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;
}
级联注释似乎会自动执行此操作,但实际上不会。
我不确定这在您的设置中是否有必要。这可能与您遇到的问题不同,因为我不熟悉您使用的某些工具,但我认为值得一试。
我创建了两个 类 Website
和 WebsiteDomain
。一个网站可以有多个域,所以我在 类.
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;
}
级联注释似乎会自动执行此操作,但实际上不会。
我不确定这在您的设置中是否有必要。这可能与您遇到的问题不同,因为我不熟悉您使用的某些工具,但我认为值得一试。