为什么反向的ID不会添加到Doctrine 2中的所有关系中



我创建了两个类WebsiteWebsiteDomain。网站可能有多个域,因此我在课堂的注释中建立了一个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;
}

级联注释似乎会自动执行此操作,但事实并非如此。

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

相关内容

  • 没有找到相关文章

最新更新