2015-04-25 75 views
0

我有一個綁定到Tolerance實體的Project實體。Symfony2以動態方式分配「子」實體的嵌入表單

表面上項目只有一個容差,所以它似乎是一對一的,但實際上我想跟蹤容差實體中的所有更改。爲此,每次保存項目時,如果公差實體字段發生更改,我想保存一個新的「版本」容差,記錄時間戳記以及誰執行了更改。

在可視化中,每次用戶看到一個項目或編輯項目時,都會看到附加的最後一個版本的容差。

問題是我不知道如何從窗體的角度來管理事物。

由於公差實體可以被引用到項目以外的其他東西,所以我有ProjectTolerance擴展了Tolerance。

這是項目實體:

/** 
* @ORM\Entity(repositoryClass="AppBundle\Entity\ProjectRepository") 
* @ORM\Table(name="projects") 
*/ 
class Project 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    protected $name; 
    //other fields 

這是基本公差:

/** @ORM\MappedSuperclass */ 
class Tolerance 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $risk; 
    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $scope; 

    // other fields   

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $timestamp; 

    /** 
    * @ORM\ManyToOne(targetEntity="User") 
    */  
    protected $changedBy;  


    public function __construct() 
    { 
     $this->timestamp = new \DateTime(); 
    } 

這是擴展:

/** 
* @ORM\Entity(repositoryClass="AppBundle\Entity\ProjectToleranceRepository") 
* @ORM\Table(name="project_tolerances") 
*/ 
class ProjectTolerance extends BaseTolerance 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Project") 
    */  
    protected $project; 

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

     return $this; 
    } 

我需要指定的關係在項目實體中,作爲oneToMany關係嗎?我想如果我這樣做,我需要調整「getTolerance」,以便它獲得最後一個版本的公差...

如何管理表單?

編輯:這裏是形式的創造,因爲它是現在(在控制器內,我會拿出來作爲一個獨立的表單類型):

$form = $this->createFormBuilder($project) 
->add('name', 'text') 
->add('approach', 'text') 
->add('background', 'text') 
->add('scope', 'text') 
->add('scopeExclusions', 'text') 
->add('interfaces', 'text') 
->add('save', 'submit', array('label' => 'Create project')) 
->getForm(); 
$form->handleRequest($request); 

什麼我缺少的可能是什麼如:

$builder->add('tolerances', 'collection', array('type' => new ProjectToleranceFormType(), 'allow_add' => true, 'label' => false, 
        'by_reference' => false, 
        )) 

謝謝!

回答

0

這是One-To-Many relation。您必須添加到您的模型類旁邊:

/** @ORM\MappedSuperclass */ 
class Project 
{ 
    ... 

    /** 
    * @ORM\OneToMany(
    *  targetEntity="Tolerance", 
    *  mappedBy="project", 
    *  orphanRemoval=true 
    *) 
    **/ 
    private $tolerances; 

    public function __construct() 
    { 
     $this->tolerances= new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
    ... 
    public function getTolerances() 
    { 
     return $this->tolerances; 
    } 

    public function addTolerance(Tolerance $tolerance) 
    { 
     $this->tolerances->add($tolerance); 
     $tolerance->setProject($this); 
    } 

    public function removeTolerance(Tolerance $tolerances) 
    { 
     $this->tolerances->removeElement($tolerances); 
     $tolerances->setProject(null); 
    } 
} 

/** @ORM\MappedSuperclass */ 
class Tolerance 
{ 
    ... 
    /** 
    * @ORM\ManyToOne(targetEntity="Project", inversedBy="tolerances") 
    * @ORM\JoinColumn(nullable=false) 
    */ 
    private $project; 
    ... 
    public function getProject() 
    { 
     return $this->project; 
    } 

    public function setProject(Project $project = null) 
    { 
     $this->project= $project; 
    } 
} 

下一步當您提交項目窗體,然後設置容差數據。

查看更多about doctrine relations

對於createdAt和UpdatedAt字段,您可以使用Timestampable Doctrine Extension

+0

謝謝,我認爲這是一個開始,但這將是一個標準的一對多的香草解決方案,但在我的情況下,我需要一對一的行爲作爲一對一。我需要一個getTolerance(注意不帶「s」)來檢索最後應用的公差。 –

+0

容差存儲在[ArrayCollection](http://www.doctrine-project.org/api/common/2.2/class-Doctrine.Common.Collections.ArrayCollection.html)中,所以只需調用:$ project - > getTolerances() - > last(); –

+0

您能分享我如何編寫formBuilder來告訴它必須獲得可視化中的最後一個嗎?這是唯一缺失的片段 –