[英]Symfony 3.4 - EntityType not working with relational database
这是我的第一个话题,如果我写错了什么,对不起。
我正在用Symfony 3.4编写代码,我想创建一个表格,让我从数据库中选择Category,并创建与此类别相关的新Type。 在建立数据库之间的关系之前,一切正常。
我花了几个小时研究如何建立这种关系,下面是我的代码,但是我找不到如何将其实现到表单的方法。 我仍然遇到错误。 大多:
An exception occurred while executing 'INSERT INTO typWydatku (kategoria, grupa) VALUES (?, ?)' with params [null, "Jedzenie_miasto"]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'kategoria' cannot be null
这是代码:
控制器:
/**
* @Route(
* "/dodajTypWydatku",
* name="milo_budzet_dodajTypWydatku"
* )
*
* @Template
*/
public function dodajTypWydatku(Request $Request) {
$dodajTypWydatku = new Entity\dodajTypWydatku();
$form = $this->createForm(Type\dodajTypWydatkuType::class, $dodajTypWydatku);
$form->handleRequest($Request);
$Session = $this->get('session');
if($Request->isMethod('POST')) {
if($form->isSubmitted() && $form->isValid()){
$em = $this->getDoctrine()->getManager();
$em->persist($dodajTypWydatku);
$em->flush();
$Session->getFlashBag()->add('success', 'Zgłoszenie zostało zapisane');
return $this->redirect($this->generateUrl('milo_budzet_dodajTypWydatku'));
} else {
$Session->getFlashBag()->add('danger', 'Popraw błędy formularza');
}
}
return array(
'form' => $form->createView(),
);
}
建造者:
class dodajTypWydatkuType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('kategoria', EntityType::class, array(
'class' => dodajKatWydatku::class,
'choice_label' => 'kategoria'
))
->add('grupa', formType\TextType::class)
->add('Zapisz', formType\SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => dodajTypWydatku::class
));
}
}
类型的实体:
/**
* @ORM\Entity
* @ORM\Table(name="typWydatku")
*/
class dodajTypWydatku {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="integer")
*
* @Assert\NotBlank
*/
private $kategoria;
/**
* @ORM\Column(type="string", length=255)
*
* @Assert\NotBlank
*/
private $grupa;
/**
* @ORM\ManyToOne(targetEntity="dodajKatWydatku", inversedBy="grupy")
* @ORM\JoinColumn(name="kategoria", referencedColumnName="id_kat")
*/
private $dodajKatWydatku;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set kategoria
*
* @param integer $kategoria
*
* @return dodajTypWydatku
*/
public function setKategoria($kategoria)
{
$this->kategoria = $kategoria;
return $this;
}
/**
* Get kategoria
*
* @return integer
*/
public function getKategoria()
{
return $this->kategoria;
}
/**
* Set grupa
*
* @param string $grupa
*
* @return dodajTypWydatku
*/
public function setGrupa($grupa)
{
$this->grupa = $grupa;
return $this;
}
/**
* Get grupa
*
* @return string
*/
public function getGrupa()
{
return $this->grupa;
}
/**
* Set dodajKatWydatku
*
* @param \MiloBudzetBundle\Entity\dodajKatWydatku $dodajKatWydatku
*
* @return dodajTypWydatku
*/
public function setDodajKatWydatku(\MiloBudzetBundle\Entity\dodajKatWydatku $dodajKatWydatku)
{
$this->dodajKatWydatku = $dodajKatWydatku;
return $this;
}
/**
* Get dodajKatWydatku
*
* @return \MiloBudzetBundle\Entity\dodajKatWydatku
*/
public function getDodajKatWydatku()
{
return $this->dodajKatWydatku;
}
}
类别实体:
/**
* @ORM\Entity
* @ORM\Table(name="katWydatku")
*/
class dodajKatWydatku {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id_kat;
/**
* @ORM\Column(type="string", length=255)
*
* @Assert\NotBlank
*/
private $kategoria;
/**
* @ORM\OneToMany(targetEntity="dodajTypWydatku", mappedBy="dodajKatWydatku")
*/
private $grupy;
public function __toString() {
return $this->kategoria;
}
/**
* Get idKat
*
* @return integer
*/
public function getIdKat()
{
return $this->id_kat;
}
/**
* Set kategoria
*
* @param string $kategoria
*
* @return dodajKatWydatku
*/
public function setKategoria($kategoria)
{
$this->kategoria = $kategoria;
return $this;
}
/**
* Get kategoria
*
* @return string
*/
public function getKategoria()
{
return $this->kategoria;
}
/**
* Constructor
*/
public function __construct()
{
$this->grupy = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add grupy
*
* @param \MiloBudzetBundle\Entity\dodajTypWydatku $grupy
*
* @return dodajKatWydatku
*/
public function addGrupy(\MiloBudzetBundle\Entity\dodajTypWydatku $grupy)
{
$this->grupy[] = $grupy;
return $this;
}
/**
* Remove grupy
*
* @param \MiloBudzetBundle\Entity\dodajTypWydatku $grupy
*/
public function removeGrupy(\MiloBudzetBundle\Entity\dodajTypWydatku $grupy)
{
$this->grupy->removeElement($grupy);
}
/**
* Get grupy
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getGrupy()
{
return $this->grupy;
}
}
我想这是我的愚蠢错误,但是我是symfony的新手,我研究了symfony.com参考资料,主义文档,stackoverflow,但我找不到任何解决方案。 正如我说过的那样,它在关联数据库之前就起作用了,但现在不是。
提前致谢。
.........................
从Hanzi进行更改后,有:
建造者:
class dodajTypWydatkuType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('dodajKatWydatku', EntityType::class, array(
'class' => dodajTypWydatku::class,
'choice_label' => 'dodajKatWydatku'
))
->add('grupa', formType\TextType::class)
->add('Zapisz', formType\SubmitType::class);
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => dodajTypWydatku::class
));
}
}
实体dodajTypWydatku:
/**
* @ORM\Entity
* @ORM\Table(name="typWydatku")
*/
class dodajTypWydatku {
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*
* @Assert\NotBlank
*/
private $grupa;
/**
* @ORM\ManyToOne(targetEntity="dodajKatWydatku", inversedBy="grupy")
* @ORM\JoinColumn(name="kategoria", referencedColumnName="id_kat")
*/
private $dodajKatWydatku;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set grupa
*
* @param string $grupa
*
* @return dodajTypWydatku
*/
public function setGrupa($grupa)
{
$this->grupa = $grupa;
return $this;
}
/**
* Get grupa
*
* @return string
*/
public function getGrupa()
{
return $this->grupa;
}
/**
* Set dodajKatWydatku
*
* @param \MiloBudzetBundle\Entity\dodajKatWydatku $dodajKatWydatku
*
* @return dodajTypWydatku
*/
public function setDodajKatWydatku(\MiloBudzetBundle\Entity\dodajKatWydatku $dodajKatWydatku = null)
{
$this->dodajKatWydatku = $dodajKatWydatku;
return $this;
}
/**
* Get dodajKatWydatku
*
* @return \MiloBudzetBundle\Entity\dodajKatWydatku
*/
public function getDodajKatWydatku()
{
return $this->dodajKatWydatku;
}
}
但是我仍然做错了事。 现在,表单显示我选择“ dodaj kat wydatku”,但没有任何选项,当我保存它时没有错误,但是db中的“ kategoria”列为空
您dodajTypWydatku
实体有类别的两个属性: $kategoria
和$dodajKatWydatku
。 那可能不是您想要的。
$kategoria
属性不是必需的 。 您可以(并且应该)将其删除。 当您具有ManyToOne
关联时,Doctrine(Symfony的ORM)将自动找出外键列的类型。[1]
之后,请确保dodajTypWydatkuType
添加了dodajKatWydatku
字段,而不是(现在已删除的) kategoria
。
[1]您甚至可以完全删除@ORM\\JoinColum
行:在这种情况下,Doctrine将创建一个名为dodajKatWydatku_id
的列(基于属性名称),其类型为整数。
好吧,昨天我不得不放弃,因为我做不到。 今天,我再次查看它,并且在构建器中的实体类型中存在错误。 现在它是:
$builder
->add('dodajKatWydatku', EntityType::class, array(
'class' => dodajKatWydatku::class,
'choice_label' => 'kategoria'
))
->add('grupa', formType\TextType::class)
->add('Zapisz', formType\SubmitType::class);
它正在工作。 感谢和主题关闭。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.