我创建了两个类Website
和WebsiteDomain
。网站可能有多个域,因此我在课堂的注释中建立了一个oneTomany关系。
weblity.php
use DoctrineORMMapping as ORM;
use JMSSerializerAnnotation as JMS;
/**
* Website object for the chosen site
*
* @ORMEntity
* @ORMTable(name="websites")
*/
class Website
{
/**
* @JMSType("integer")
*
* @ORMId
* @ORMColumn(type="integer", nullable=false)
* @ORMGeneratedValue
*
* @var integer $id
*/
protected $id;
/**
* Domains that this website answers on
*
* @JMSType("ArrayCollection<TurtleModelEntityWebsiteDomain>")
* @ORMOneToMany(targetEntity="WebsiteDomain", mappedBy="website", cascade={"persist", "remove"})
*
* @var WebsiteDomain
*/
private $domains;
}
websitedomain.php
use DoctrineORMMapping as ORM;
use JMSSerializerAnnotation as JMS;
/**
* Website object for the chosen site
*
* @ORMEntity
* @ORMTable(name="website_domains")
*/
class WebsiteDomain
{
/**
* @JMSType("integer")
*
* @ORMId
* @ORMColumn(type="integer", nullable=false)
* @ORMGeneratedValue
*
* @var integer $id
*/
protected $id;
/**
* Website that this domain belongs to
*
* @JMSType("Website")
* @ORMManyToOne(targetEntity="Website", inversedBy="domains")
*
* @var TurtleModelEntityWebsite
*/
private $website;
}
现在,当我创建一个具有多个域附加的新网站时,所有记录都是在相关表中创建的,但是域属于null的webiste_id
。
| id | name | description | parent | storageName |
|----|---------|----------------|--------|-------------|
| 1 | foo_bar | FooBar Website | | foo_bar |
| id | website_id | domain | primary |
|----|------------|--------------|---------|
| 1 | NULL | foobar.co.uk | 1 |
website_id
在第一个表中与网站有关的最后一个表中应为null。
我知道这个问题已经在这里被问到很多次,但是我找不到答案。我已经与不同的PDO驱动程序,SQL和MySQL一起玩,并且都表现出同样的问题。
我正在使用以下对象创建记录。我唯一能想到的是,网站中的website_id
设置为无效,但是如果是这样,我该如何获得教义来覆盖此值?
object(TurtleModelEntityWebsite)#412 (10) {
["name":"TurtleModelEntityWebsite":private]=>
string(7) "foo_bar"
["displayName":"TurtleModelEntityWebsite":private]=>
string(7) "Foo Bar"
["description":"TurtleModelEntityWebsite":private]=>
string(14) "FooBar Website"
["parent":"TurtleModelEntityWebsite":private]=>
NULL
["domains":"TurtleModelEntityWebsite":private]=>
object(DoctrineCommonCollectionsArrayCollection)#410 (1) {
["elements":"DoctrineCommonCollectionsArrayCollection":private]=>
array(1) {
[0]=>
object(TurtleModelEntityWebsiteDomain)#371 (7) {
["website":"TurtleModelEntityWebsiteDomain":private]=>
NULL
["domain":"TurtleModelEntityWebsiteDomain":private]=>
string(12) "foobar.co.uk"
["primary":"TurtleModelEntityWebsiteDomain":private]=>
bool(true)
["id":protected]=>
NULL
["created":protected]=>
NULL
["modified":protected]=>
NULL
["admupdated":protected]=>
bool(false)
}
}
}
["storageName":"TurtleModelEntityWebsite":private]=>
string(7) "foo_bar"
["id":protected]=>
NULL
["created":protected]=>
NULL
["modified":protected]=>
NULL
["admupdated":protected]=>
bool(false)
}
使用JMS Serializer从数组中对此对象进行了测试。
任何指针都很满意。
通常在使用学说时,当我忘记将父母在父母的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;
}
级联注释似乎会自动执行此操作,但事实并非如此。
我不确定您的设置是否有必要。这可能不是您遇到的问题,因为我不熟悉您使用的某些工具,但认为值得一试。