Symfony 3.4 - EntityType 不适用于关系数据库



这是我在这里的第一个主题,如果我写错了什么,很抱歉。

我正在用Symfony 3.4编写,我想创建表单,让我从数据库中选择类别并创建与此类别相关的新类型。在我建立数据库之间的关系之前,它工作正常。

我花了几个小时来研究如何建立这种关系,下面是我的代码,但我找不到如何实现它到我的表单的方法。我仍然收到错误。主要:

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 EntitydodajTypWydatku();
$form = $this->createForm(TypedodajTypWydatkuType::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', formTypeTextType::class)
->add('Zapisz', formTypeSubmitType::class);
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => dodajTypWydatku::class
));
}
}

类型的实体:

/**
* @ORMEntity
* @ORMTable(name="typWydatku")
*/
class dodajTypWydatku {
/**
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMColumn(type="integer")
* 
* @AssertNotBlank
*/
private $kategoria;
/**
* @ORMColumn(type="string", length=255)
* 
* @AssertNotBlank
*/
private $grupa;
/**
* @ORMManyToOne(targetEntity="dodajKatWydatku", inversedBy="grupy")
* @ORMJoinColumn(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 MiloBudzetBundleEntitydodajKatWydatku $dodajKatWydatku
*
* @return dodajTypWydatku
*/
public function setDodajKatWydatku(MiloBudzetBundleEntitydodajKatWydatku $dodajKatWydatku)
{
$this->dodajKatWydatku = $dodajKatWydatku;
return $this;
}
/**
* Get dodajKatWydatku
*
* @return MiloBudzetBundleEntitydodajKatWydatku
*/
public function getDodajKatWydatku()
{
return $this->dodajKatWydatku;
}
}

类别的实体:

/**
* @ORMEntity
* @ORMTable(name="katWydatku")
*/
class dodajKatWydatku {
/**
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id_kat;
/**
* @ORMColumn(type="string", length=255)
* 
* @AssertNotBlank
*/
private $kategoria;
/**
* @ORMOneToMany(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 DoctrineCommonCollectionsArrayCollection();
}
/**
* Add grupy
*
* @param MiloBudzetBundleEntitydodajTypWydatku $grupy
*
* @return dodajKatWydatku
*/
public function addGrupy(MiloBudzetBundleEntitydodajTypWydatku $grupy)
{
$this->grupy[] = $grupy;
return $this;
}
/**
* Remove grupy
*
* @param MiloBudzetBundleEntitydodajTypWydatku $grupy
*/
public function removeGrupy(MiloBudzetBundleEntitydodajTypWydatku $grupy)
{
$this->grupy->removeElement($grupy);
}
/**
* Get grupy
*
* @return DoctrineCommonCollectionsCollection
*/
public function getGrupy()
{
return $this->grupy;
}
}

我想这是我愚蠢的错误,但我是symfony的新手,我研究了 symfony.com 参考文献,学说文档,堆栈溢出,我找不到任何解决方案。正如我所说,它在关联数据库之前有效,现在它不是。

提前谢谢。

.........................

从汉字进行更改后,有:

建筑工人:

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', formTypeTextType::class)
->add('Zapisz', formTypeSubmitType::class);
}
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => dodajTypWydatku::class
));
}
}

Entity dodajTypWydatku:

/**
* @ORMEntity
* @ORMTable(name="typWydatku")
*/
class dodajTypWydatku {
/**
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORMColumn(type="string", length=255)
* 
* @AssertNotBlank
*/
private $grupa;
/**
* @ORMManyToOne(targetEntity="dodajKatWydatku", inversedBy="grupy")
* @ORMJoinColumn(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 MiloBudzetBundleEntitydodajKatWydatku $dodajKatWydatku
*
* @return dodajTypWydatku
*/
public function setDodajKatWydatku(MiloBudzetBundleEntitydodajKatWydatku $dodajKatWydatku = null)
{
$this->dodajKatWydatku = $dodajKatWydatku;
return $this;
}
/**
* Get dodajKatWydatku
*
* @return MiloBudzetBundleEntitydodajKatWydatku
*/
public function getDodajKatWydatku()
{
return $this->dodajKatWydatku;
}
}

但我仍然做错了什么。现在表单显示我选择"dodaj kat wydatku"但没有选项,当我保存它时没有错误,但 db 中的"kategoria"列为空

您的dodajTypWydatku实体具有两个类别属性:$kategoria$dodajKatWydatku。这可能不是你想要的。

$kategoria属性不是必需的。您可以(并且应该)删除它。当你有一个ManyToOne关联时,Doctrine(Symfony的ORM)将自动确定外键列需要是什么类型。[1]

之后,确保dodajTypWydatkuType添加了dodajKatWydatku字段,而不是(现已删除的)kategoria


[1] 您甚至可以完全删除@ORMJoinColum行:在这种情况下,Doctrine 将创建一个名为dodajKatWydatku_id(基于属性名称)的整数类型的列。

好吧,昨天我不得不放弃,因为我做不到。今天我又看了一遍,错误在我的构建器中的实体类型中。现在是:

$builder 
->add('dodajKatWydatku', EntityType::class, array(
'class' => dodajKatWydatku::class,
'choice_label' => 'kategoria'
))
->add('grupa', formTypeTextType::class)
->add('Zapisz', formTypeSubmitType::class); 

它正在起作用。谢谢和主题结束。

相关内容

  • 没有找到相关文章

最新更新