一对多的学说 - 持有多个文件从拥有方不工作

时间:2016-09-30 16:11:58

标签: symfony doctrine-orm doctrine

我有2个实体提交和文件。 1提交可以有多个文档。 提交实体:

  /**
   * @ORM\OneToMany(targetEntity="AppBundle\Entity\Document", mappedBy="submission",cascade={"persist", "remove" })
   * @ORM\JoinColumn(name="id", referencedColumnName="submission_id")
   */
  protected $document;


  /**
   * @return mixed
   */
  public function getDocument()
  {
    return $this->document->toArray();
  }

  public function setDocument(Document $document)
  {
    $this->document[] = $document;

    return $this;
  }

文件实体:

  /**
   * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Submission", inversedBy="document")
   * @ORM\JoinColumn(name="submission_id", referencedColumnName="id",onDelete="cascade", nullable=true)
   */
  protected $submission;

  public function getSubmission()
  {
    return $this->submission;
  }

  /**
   * @param mixed $submission
   */
  public function setSubmission($submission)
  {
    $this->submission = $submission;
  }

接收文件dropzonejs后 - 我将它们保存到Document对象中,然后,我尝试将此对象保存到Submission中,并保持不变。

$document = new Document();
$em = $this->getDoctrine()->getManager();
$media = $request->files->get('file');
foreach($media as $req){
  $document->setFile($req);
  $document->setPath($req->getPathName());
  $document->setName($req->getClientOriginalName());
  $em->persist($document);
} 

    $submission->setSubmissionStatus(true);
      foreach($document as $item){
        $submission->setDocument($item);
      }
    $submission->setUser($user);
    $em = $this->getDoctrine()->getManager();
    $em->persist($submission);
    $em->flush();

问题是,我一直收到没有设置submission_title的错误,但事实并非如此,因为我之前已经设置了这个字段。我没有想法,有什么不对。

1 个答案:

答案 0 :(得分:0)

我认为如果您还没有在http://symfony.com/doc/current/doctrine/associations.html上完成教程,那么您将获得一些好处。

我可以看到,您的getter / setter不适合将多个DocumentSubmission相关联。

当他们在Symfony文档中写道,他们想要将一个类别与许多产品相关联时,他们会有以下代码:

// src/AppBundle/Entity/Category.php

// ...
use Doctrine\Common\Collections\ArrayCollection;

class Category
{
    // ...

    /**
     * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
     */
    private $products;

    public function __construct()
    {
        $this->products = new ArrayCollection();
    }
}

来自文档:

  

构造函数中的代码很重要。而不是   实例化为传统数组,$ products属性必须是   一种实现Doctrine的Collection接口的类型。在这种情况下,   使用ArrayCollection对象。这个对象看起来和行为差不多   完全像一个数组,但有一些额外的灵活性。如果这样做   你不舒服,别担心。试想一下,这是一个数组和   你会保持良好的状态。

因此,您需要确保Document实体的构造函数与$this->submissions = new ArrayCollection();类似。我已将属性更改为复数名称,因为我认为它在语义上更正确。但是,如果您愿意,可以保留$submission属性名称。

接下来是添加addSubmissionremoveSubmissiongetSubmissions方法。

然后,你的班级可能看起来像这样:

<?php
// src/AppBundle/Entity/Submission.php

namespace AppBundle\Entity

use Doctrine\Common\Collections\ArrayCollection;

class Submission 
{

    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Document", mappedBy="submission",cascade={"persist", "remove" })
     * @ORM\JoinColumn(name="id", referencedColumnName="submission_id")
     * 
     * @var ArrayCollection()
     */
    protected $documents;

    ...

    /**
     * Instantiates the Submission Entity
     *
     * @return void
     */
    public function __construct()
    {
        $this->documents = new ArrayCollection();
    }

    /**
     * Returns all documents on the Submission
     *
     * @return mixed
     */
    public function getDocuments()
    {
        return $this->documents;
    }

    /**
     * Add document to this Submission
     * 
     * @param Document $document The object to add to the $documents collection.
     *
     * @return Submission
     */
    public function setDocument(Document $document)
    {
        $this->documents[] = $document;

        return $this;
    }

    /**
     * Remove a document from this Submission
     * 
     * @param Document $document The object to remove from the $documents collection.
     *
     * @return Submission
     */
    public function removeDocument(Document $document)
    {
        $this->documents->removeElement($document);

        return $this;
    }
}