我有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的错误,但事实并非如此,因为我之前已经设置了这个字段。我没有想法,有什么不对。
答案 0 :(得分:0)
我认为如果您还没有在http://symfony.com/doc/current/doctrine/associations.html上完成教程,那么您将获得一些好处。
我可以看到,您的getter / setter不适合将多个Document
与Submission
相关联。
当他们在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
属性名称。
接下来是添加addSubmission
,removeSubmission
和getSubmissions
方法。
然后,你的班级可能看起来像这样:
<?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;
}
}