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

ron*_*ald 2 doctrine symfony doctrine-orm

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

当表单显示时,宗教列表将在下拉列表/组合框中可用。

例子 :

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

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

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 ... ***/
}
Run Code Online (Sandbox Code Playgroud)

/表格/宗教类型

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';
}
}
Run Code Online (Sandbox Code Playgroud)

/控制器

/**
 * @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()
        )
    );
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道该写什么,所以我将其保留为 __________ 以及缺少的代码是什么。

/宗教知识库

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

/树枝文件

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

{% block body %}

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

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

ron*_*ald 5

正如 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()
        )
    );
}
Run Code Online (Sandbox Code Playgroud)