2017-02-23 54 views
1

我目前在學習Symfony 3.2,並一直關注Symfony網站上的文檔。但是,我正在努力完成與表單有關的一些問題,所以任何指針都會很棒!試圖將數據加載到ChoiceType表單中,但它不能保存

我有兩個實體:

工作:

class Job 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    private $job_name; 
    /** 
    * @ORM\Column(type="integer") 
    */ 
    private $category_id; 

和類別:

class Category 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    private $category_name; 

我也有每個以上(CategoryTypeJobType)實體的形式。在我的工作類型中,我想category_id是一個下拉列表,裏面列出了類別的ID。

我跟着這裏的文檔: http://symfony.com/doc/current/reference/forms/types/choice.html 並有評論說,在這裏問: Passing data to buildForm() in Symfony 2.8/3.0

在我JobController我曾經主義來獲取所有的結果從類別表:

$em = $this->getDoctrine()->getManager(); 
$categories = $em->getRepository('AppBundle:Category')->findAll(); 

然後我在選項數組中輸入$ category到我的表單中:

$form = $this->createForm('AppBundle\Form\JobType', $job, array('categories' => $categories)); 

在我JobType:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'AppBundle\Entity\Job', 
     'categories' => null, 
    )); 
} 

在我的建設者我加入了ChoiceType::classcategory_id並添加選項類別的選擇陣列:

->add('category_id', ChoiceType::class, array(
      'choices' => $options['categories'], 
      'choice_label' => 'category_name', 
      'choice_value' => 'id', 
      'placeholder' => 'Assign job to category...', 
)) 

該工程確定在如何條款我們加載到視圖,但是當我點擊創建(提交表單)我得到以下錯誤:

An exception occurred while executing 'INSERT INTO jobs (job_name, category_id) VALUES (?, ?)' with params ["test", null, {}, null, null]:

Catchable Fatal Error: Object of class AppBundle\Entity\Category could not be converted to string

我猜測這與試圖保存爲對象的價值有關嗎?但我不確定如何解決這個問題,或者如果我以正確的方式解決問題?

回答

0

它可能的分辨率僅僅是開始使用EntityType::class你的問題,但你必須先在作業和類別之間建立真正的關係,更新你的數據庫,然後檢查你的表單類型。使用你的代碼,你沒有使用Symfony和Doctrine及其ORM的真正潛力。

我會堅持第一部分,其餘部分將要求您多研究一下Symfony documentation,因爲它對於SO來說有點過於寬泛。

爲了使您的實體之間的關係確實,我們將工作和類別之間添加一個關係:

Job.php

use Doctrine\ORM\Mapping as ORM; 

class Job 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    private $job_name; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="jobs") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    private $category; 

Category.php

use Doctrine\Common\Collections\ArrayCollection; 

class Category 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    private $category_name; 

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

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

然後,在你的表格中,它應該是這樣的:

->add('category', EntityType::class, array(
    'class' => 'AcmeBundle\Entity\Category', 
    'choice_label' => 'category_name', 
    'placeholder' => 'Assign job to category...', 
)) 
+1

謝謝!現在就開始工作吧!之前我曾嘗試過實體映射和實體類型,但我必須做到不正確。推測的選擇類型是這樣做的。我將查看您鏈接的文檔以獲得更好的理解。 - 謝謝您的幫助! – DBarkz

+0

很高興它幫助你做出「點擊」:) – Veve

0

你可以在你的category類中實現一個__toString()方法,但它有點難看。

一種更好的方式將您的實體映射到一起爲Symfony doc about entities associations解釋

class Job 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    private $job_name; 
    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    private $category; 

然後在您的形式

->add('category', EntityType::class, array(
    'class' => 'AppBundle\Entity\Category', 
    'choice_label' => 'category_name', 
    'placeholder' => 'Assign job to category...', 
)) 
相關問題