我的学说协会不能正常运作

时间:2016-10-10 05:53:56

标签: symfony doctrine associations

HIHO,

我想要实现的目标:我有项目,在项目编辑中,有一个表格,我可以放下图像(使用dropzone.js),这些图像被保存并分配给给定的项目。

图片上传工作,图像实体被保存到图像表,他们有正确的project_id。但是,如果我访问Project Enity,项目数组中的“images”为“null”。不是图像实体的集合。 它看起来像一个简单的私有变量,没有默认值。 我想我的OneToMany和ManyToOne协会似乎不起作用。

一些代码:

Project.php

    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Image", mappedBy="project", cascade={"persist, remove"})
     */
    private $images;

    /**
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getImages()
    {
        return $this->images;
    }

    public function addImage(Image $image)
    {
        $this->images[] = $image;
    }

    public function removeImage(Image $image) {
        $this->images->removeElement($image);
    }

Image.php

    /**
     * @var \AppBundle\Entity\Project
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Project", inversedBy="images")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="project_id", referencedColumnName="id")
     * })
     */
    private $project;

    /**
     * Set project
     *
     * @param \AppBundle\Entity\Project $project
     *
     * @return Image
     */
    public function setProject(\AppBundle\Entity\Project $project = null)
    {
        $this->project = $project;

        return $this;
    }

    /**
     * Get project
     *
     * @return \AppBundle\Entity\Project
     */
    public function getProject()
    {
        return $this->project;
    }

所有内容都保存到DB

enter image description here enter image description here

但图像为“null”(不是ArrayCollection :() enter image description here

也许,缺少一些东西。但我没有看到它(虽然它是soooo基本的东西)

干杯 阿德里安

3 个答案:

答案 0 :(得分:0)

在Project.php中执行以下操作

在构造函数中,添加以下内容:

public function __construct()
{
    // ...
    $this->images = new ArrayCollection();
}

*将addImage函数更改为:

public function addImage(Image $image)
{
    if(!$this-images->contains($image))
        $this-images->add(image);
}

然后在Image.php中,将setProject更改为:

public function setProject(\AppBundle\Entity\Project $project = null)
{
    $this->project = $project;

    if($project != null)
        $project->addImage($this);

    return $this;
}

保留一些图像并检查“图像”是否为空。

答案 1 :(得分:0)

我同意Medard关于构造函数的意见,你也可以尝试在oneToMany注释上将fetch参数设置为lazy。

也许是paramConverter的错过

答案 2 :(得分:0)

哦,男孩......

当我从DB生成实体(带有doctrine:generate)时,在生成过程中有映射文件(参见http://symfony.com/doc/current/doctrine/reverse_engineering.html

一旦我删除了src / AppBundle / Resources / config / doctrine文件夹(其中包含orm.config.xml文件),图像就显示为持久的ArrayCollection。

但结果仍为空。 所以我不得不另外将fetch =“EAGER”放入OneToMany Mapping中,因为Lazyloading似乎没有正常工作(在twig中转储时,结果project.images没有初始化)

非常感谢你的帮助。最后,我的图像正常显示。

如果symfony会在dev.log中写入映射错误,那就太好了,所以我不必搜索2天。

氰 阿德里安