2

我有两个实体,View并且Location

每个都View可以有一个Location

在我看来,我因此有:

class View
{
    //..... Other Stuff.....

    /**
     * @ManyToOne(targetEntity="Location", inversedBy="views")
     **/
    private $location;

    //...setters and getters....

    public function setLocation($location){
        $this->location = $location;
    }

}

然后是我的位置

class Location
{
    //.....other stuff.....

    /**
     * @OneToMany(targetEntity="View", mappedBy="location")
     **/
    private $views;

    public function __construct() {
        $this->created = $this->updated = new \DateTime("now");
        $this->views = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // .... Getters and Setters ....
}

但是当我尝试这样做时:

<?php
    $this->pageview = $this->em->getRepository('Entities\View')->find(1);
    $this->location = $this->em->getRepository('Entities\Location')->find(1);
    $this->pageview->setLocation($this->location);
    $this->em->persist($this->pageview);
    $this->em->flush();
?>

甚至当我创建新实体时:

<?php
    $pv = new Entities\Pageview;
    $lc = new Entities\Location;
    $this->em->persist($lc);
    $this->em->flush();
    $pv->setLocation($lc);
    $this->em->persist($pv);
    $this->em->flush();
?>

Doctrine从不设置数据库中的 location_id(它始终为 NULL)。

我检查了 SQL 查询,甚至没有尝试设置它们,我得到的是:

INSERT INTO View (field1, field2, created, updated) VALUES ('val1', 'val2', '2013-07-17T12:10:56+01:00', '2013-07-17T12:10:56+01:00')

没有任何位置参考...奇怪的是我可以很好地更新 field1 和 field2...所有其他关系在我的整个应用程序中都有效...我只是无法获得视图和位置工作...

编辑

我现在有一些确切的代码在另一台计算机上工作。我不知道为什么它不起作用,但我只是将文件移回并重新启动计算机,现在它是......缓存问题我猜?

4

4 回答 4

1

重新启动我的计算机,问题得到解决......我不知道为什么会出错!

也许与缓存或代理有关...我不知道...

于 2013-07-17T16:36:39.117 回答
0

我认为您需要在该位置加载视图。因此,您必须在 Location 实体中创建一个方法,如下所示:

public function getViews() {
    return $this->views;
}

然后要持久化到数据库中,请执行以下操作:

$location = new Entity\Location();
$view = new Entity\View();
$location->getViews()->add($view);
$this->em->persist($location)
$view->setLocation($location);
$this->em->persist($view);
$this->em->flush();
于 2013-07-17T15:06:59.450 回答
0

您可以尝试明确引用 Doctrine 需要对其进行连接的正确列。

/**
 * @ManyToOne(targetEntity="Location")
 * @JoinColumn(name="location_id", referencedColumnName="id")
 */
private $location;

此外,在此示例中:

$this->pageview = $this->em->getRepository('Entities\View')->find(1);
$this->location = $this->em->getRepository('Entities\Location')->find(1);
$this->pageview->setLocation($this->location);
$this->em->persist($this->pageview);
$this->em->flush();

如果您只是更新现有数据,则不需要持久化实体。

于 2013-07-17T11:31:25.077 回答
0

这与 Doctrine ORM 缓存驱动程序有关:

doctrine:
    orm:
        entity_managers:
            default:
                metadata_cache_driver: apcu
                result_cache_driver: apcu
                query_cache_driver: apcu

我们曾经APCu甚至在DEV做缓存,清除 APCu(通过重新启动 Apache)就可以了。

于 2016-11-10T11:03:32.707 回答