2017-08-14 106 views
1

我正在設計一個管理報表的應用程序。我正在用Symfony 3.2.6進行開發。在這個picture中,您可以看到我的數據模型。我希望做兩件事情: 1.提交報告,數給出模塊創建新的佈局 2.創建的這個報告實例,並將其保存在數據庫中從通用數據生成Symfony表格

所以我覺得這是一個辦法做到這一點有了這個數據模型,不是嗎?但是我現在怎麼才能從Symfony中創建一個表單呢?

我做這樣的事情:

$builder 
     ->add('name', TextType::class) 
    ; 

    foreach ($options['moduleValues'] as $moduleValue) 
    { 
     if($moduleValue instanceof RangeModuleValue) 
     { 
      $builder->add('value', RangeType::class, array(
       'attr' => array(
        'min' => $moduleValue->getRangeModule()->getStartValue(), 
        'max' => $moduleValue->getRangeModule()->getEndValue() 
       ) 
      )); 
     } 
    } 

但後來我得到的錯誤:

Neither the property "value" nor one of the methods "getValue()", "value()", "isValue()", "hasValue()", "__get()" exist and have public access in class "ReportBundle\Entity\Report". 

我認爲錯誤是明確的,「價值」是表中range_module_value。但是,我應該如何改變我的設計或我的表格來處理這個問題?

注意:父類Module存在,因爲將來會有其他模塊,如「TextModule」。

這裏是我班報告:

class Report 
{ 
/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
*/ 
private $name; 

/** 
* @ORM\ManyToOne(targetEntity="ReportBundle\Entity\ReportLayout") 
* @ORM\JoinColumn(name="layout_id", referencedColumnName="id") 
*/ 
private $layout; 

/** 
* Report constructor. 
* @param int $id 
*/ 
public function __construct($layout) 
{ 
    $this->layout = $layout; 
} 


/** 
* @return int 
*/ 
public function getLayout() 
{ 
    return $this->layout; 
} 

/** 
* @param int $layout 
*/ 
public function setLayout($layout) 
{ 
    $this->layout = $layout; 
} 

/** 
* Get id 
* 
* @return int 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set name 
* 
* @param string $name 
* 
* @return Report 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

/** 
* Get name 
* 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

}

這裏是類RangeModuleValue,其中我想堅持一個模塊的值特定報表。

class RangeModuleValue 
{ 
/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\ManyToOne(targetEntity="ReportBundle\Entity\RangeModule") 
* @ORM\JoinColumn(name="rangeModule_id", referencedColumnName="id") 
*/ 
private $rangeModule; 

/** 
* @ORM\ManyToOne(targetEntity="ReportBundle\Entity\Report") 
* @ORM\JoinColumn(name="report_id", referencedColumnName="id") 
*/ 
private $report; 

/** 
* @var int 
* 
* @ORM\Column(name="value", type="integer") 
*/ 
private $value; 

/** 
* RangeModuleValue constructor. 
* @param $rangeModule 
* @param $report 
*/ 
public function __construct($report, $rangeModule) 
{ 
    $this->report = $report; 
    $this->rangeModule = $rangeModule; 
} 


/** 
* Get id 
* 
* @return int 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set rangeModule 
* 
* @param string $rangeModule 
* 
* @return RangeModuleValue 
*/ 
public function setRangeModule($rangeModule) 
{ 
    $this->rangeModule = $rangeModule; 

    return $this; 
} 

/** 
* Get rangeModule 
* 
* @return string 
*/ 
public function getRangeModule() 
{ 
    return $this->rangeModule; 
} 

/** 
* Set report 
* 
* @param string $report 
* 
* @return RangeModuleValue 
*/ 
public function setReport($report) 
{ 
    $this->report = $report; 

    return $this; 
} 

/** 
* Get report 
* 
* @return string 
*/ 
public function getReport() 
{ 
    return $this->report; 
} 

/** 
* Set value 
* 
* @param integer $value 
* 
* @return RangeModuleValue 
*/ 
public function setValue($value) 
{ 
    $this->value = $value; 

    return $this; 
} 

/** 
* Get value 
* 
* @return int 
*/ 
public function getValue() 
{ 
    return $this->value; 
} 

}

+0

我想你需要添加一個功能的addValue()到你的實體。你可以添加你的實體(類)到你的文章? –

+1

嗨Melik,感謝您的編輯。我添加了報告類和rangeModuleValue類(我想保留該值)。我應該編輯我的數據庫設計嗎?或者這種設計有可能嗎? –

回答

0

在課堂上報告添加此功能允許添加許多$rangeModule$value

public function addrangemodule (RangeModuleValue $rangeModule) 
    { 
     $day->setIdReport($this); 
     $this->ranges->add($day); 
    } 

但範圍應該是一個ArrayCollection:

public function setranges(ArrayCollection $ranges) 
    { 
     $this->ranges= $ranges; 
    } 

在控制器根據需要添加: $ range = new RangeModuleValue();

$report->addrangemodule ($range); 

此代碼僅僅是一個例子,我不確定他是否工作。

欲瞭解更多信息,這是文檔:

https://symfony.com/doc/current/form/form_collections.html

http://www.doctrine-project.org/api/common/2.3/class-Doctrine.Common.Collections.ArrayCollection.html

+0

謝謝,但是當我有更多不同的模塊類型。我應該生成一個父類ModuleValue和一個1:n的relationshop來報告嗎? –

+0

我想你需要使用關聯映射而不是繼承。看看這個:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html –