如何从数据库中的ChoiceType选项选项中加载数据

时间:2016-10-14 06:22:34

标签: symfony doctrine-orm doctrine

我想用ChoiceType构建一个表单,选项值/选项基于数据库表(已经有记录)。

显示表格后,宗教信息列表将显示在下拉列表/组合框中。

示例:

 $builder->add('name',  ChoiceType::class, array(
                'choices' => $religions //List of religions 
    ));

到目前为止,这是我的代码:

class Religion
{
/**
 * @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=50)
 */
protected $name;

/*** getter/setter ... ***/
}

/形式/ ReligionType

class ReligionType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name',  ChoiceType::class, array(
                'choices' =>  ____________ 
    ));
}

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

public function getName()
{
    return 'app_bundle_religion_type';
}
}

/控制器

/**
 * @Route("/religion/select", name="religion_select")
 *
 */
public function selectAction()
{
    $em = $this->getDoctrine()->getManager();
    $religions = $em->getRepository('AppBundle:Religion')->findAll();


    $form = $this->createForm(ReligionType::class, ________);

    return $this->render(
        'religion/index.html.twig', array(
            'form' => $form->createView()
        )
    );
}

我真的不知道该怎么写,所以我把它留作__________以及缺少什么代码。

/ ReligionRepository

class ReligionRepository extends EntityRepository
{
public function findAll()
{
    return $this->getEntityManager()
        ->createQuery(
            'SELECT p FROM AppBundle:Religion p ORDER BY p.name ASC'
        )
        ->getResult();
}
}

/ Twig文件

{% extends 'base.html.twig' %}

{% block body %}

{{ form_start(form) }}
{{ form_widget(form) }}
<button type="submit">Save</button>
{{ form_end(form) }}

{% endblock %}

2 个答案:

答案 0 :(得分:2)

我确实喜欢这个:

protected $currency;
 /**
     * Constructor
     */
    public function __construct()
    {
        parent::__construct();
        $this->Currency = new \Doctrine\Common\Collections\ArrayCollection();
    }

/**
 * @param \MyBundle\Entity\Currency $Currency
 *
 * @return $this
 */
public function addCurrency(\MyBundle\Entity\Currency $Currency)
{
    $this->Currency[] = $Currency;

    return $this;
}

/**
 * Remove Currency
 *
 * @param \MyBundle\Entity\Currency $Currency
 */
public function removeCurrency(\MyBundle\Entity\Currency $Currency)
{
    $this->Currency->removeElement($Currency);
}

/**
 * Get Currency
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getCurrency()
{
    return $this->Currency;
}

在我这样的实体中:

get

答案 1 :(得分:2)

按照Rvanlaak的建议,这是解决方案。

 //ReligionType
 $builder->add('religions',  EntityType::class, array(
                'class' => 'AppBundle\Entity\Religion',
                'choice_label' => 'name'
    ));

 //Controller
public function newAction(Request $request)
{

    $religion = new Religion();
    $form = $this->createForm(ReligionType::class, $religion);

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($religion);
        $em->flush();

        //return $this->redirectToRoute('homepage');
    }


    return $this->render(
        'religion/new.html.twig',
        array(
            'form' => $form->createView()
        )
    );
}