Symfony -如何以“多对一”的形式保存外键

bqucvtff  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(120)

我是Symfony 2的新手,我试图为一个有外键的内容类型构建一个表单。我不知道如何使用表单保存外键。
我的两个表是“Category”和“Question”。一个问题属于一个类别(多对一)。所以我在Entity中的php文件包含:

<?php

namespace Iel\CategorieBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Question
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Iel\CategorieBundle\Entity\QuestionRepository")
 */
class Question
{
    /**
    * @ORM\ManyToOne(targetEntity="Iel\CategorieBundle\Entity\Categorie")
    * @ORM\JoinColumn(nullable=false)
    */
    private $categorie;
    /**
    * Set categorie
    *
    @param Iel\CategorieBundle\Entity\Categorie $categorie
    */
    public function setCategorie(\Iel\CategorieBundle\Entity\Categorie $categorie)
    {
        $this->categorie = $categorie;
    }
    /**
    * Get categorie
    *
    @return Iel\CategorieBundle\Entity\Categorie
    */
    public function getCategorie()
    {
        return $this->categorie;
    }

我试着像这样构建控制器函数,但它不是一个正确的语法:

public function addquestionAction()
{
    $question = new Question;

    $form = $this->createFormBuilder($question)
        ->add('titre', 'text')
        ->add('auteur', 'text')
        ->add('contenu', 'textarea')
        ->add('category_id', $this->getCategorie())    
        ->getForm();    

    $request = $this->get('request');

我不知道如何使用此表单在Question的表中写入当前category_id。

irlmq6kh

irlmq6kh1#

更好的方法是声明类型为“实体”的“类别”。类似这样:

$form = $this->createFormBuilder($question)
    ->add('titre', 'text')
    ->add('auteur', 'text')
    ->add('contenu', 'textarea')
    ->add('category', 'entity', array(
        'class' => 'IelCategorieBundle:Categorie',
        'property' => 'name',
    ))
    ->getForm();

这将创建一个select,其中选项值是类别id,选项显示值是类别名称。持久化$question对象将在“questions”表的外键字段中插入类别id。

nwwlzxa7

nwwlzxa72#

尝试使用categorie而不是category_id。Doctrine和SF2 Forms使用关联,而不是外键。
另外,$this->getCategorie()也不起作用。你在控制器上下文中。而不是让表单根据QuestionMap文件猜测类型。

/* ... */
$form = $this->createFormBuilder($question)
    ->add('titre', 'text')
    ->add('auteur', 'text')
    ->add('contenu', 'textarea')
    ->add('categorie', null)    
    ->getForm(); 
/* ... */
euoag5mw

euoag5mw3#

我使用symfony 6.2,现在我们可以使用EntityType,这里是一个例子:

use Symfony\Bridge\Doctrine\Form\Type\EntityType;

$builder->add('someid', EntityType::class, [
    'class' => 'App\Entity\MyCibleEntity',
    'by_reference' => 'cibleid',
    'choice_label' => 'ciblename',
]);

不要忘记choice_label,否则你可能会出现类似“Object of class X could not be converted to string.”的错误。

相关问题