如何为连接表实体构建表单字段

时间:2016-05-27 10:46:31

标签: php symfony

在Symfony 3.0中,我有2个实体:Boat和Amenity。 Boat和Amenity之间需要有一个ManyToMany关系。我还需要能够存储一艘船的设施数量。例如。一艘船可以有3艘皮划艇。因此我创建了连接表JoinBoatAmentity,它存储了:boat_id,amenity_id,amount。

我的实体设置如下:

Boat<OneToMany>JoinBoatAmentity<ManyToOne>Amenity

我已根据本文http://future500.nl/articles/2013/09/doctrine-2-how-to-handle-join-tables-with-extra-columns/

创建了这种关系

我希望表单中的一个部分显示存储在Amenity表中的所有设施,并且旁边会显示一个显示该船数量的字段,如果它没有显示0任何。 例如:

[3] Kayak
[0] Surfboard

编辑 - &gt; (我在下面添加了一些示例代码):

目前我的表单构建器看起来像这样。这会正确显示JoinBoatAmenity表中船的设施,但它不会显示船在JoinBoatAmenity中没有的设施。我需要表单构建器代码,它还添加了船只没有0值的其他现有设施。与[0] Surfboard

一样
#AdminBundle/Form/BoatType.php
namespace AdminBundle\Form;
class BoatType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('joinBoatAmenities', CollectionType::class, [
                'entry_type' => JoinBoatAmenityType::class,
            ])
    }

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

#AdminBundle/Form/JoinBoatAmenityType.php
namespace AdminBundle\Form;
class JoinBoatAmenityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('amenity', TextType::class, [
                'label' => false,
                'disabled' => true,
            ])
            ->add('amount', TextType::class);
    }

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

1 个答案:

答案 0 :(得分:0)

您显示零代码,因此很难帮助您。希望你能接受我的回答,因为我付出了一些努力。在stackoverflow上,我们期待您的努力......

首先在您的控制器中(查询船只搜索 - 我认为这是您首先要做的)您应该有一个查询构建器,如下所示:

$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$qb->select('b')
    ->from('AppBundle:Boat', 'b')
    ->where('b.boat_id = :boatID')
    ->setParameter('boatID', $boatToGetId)
    ->orderBy('b.boat_id', 'DESC');
$boat_results = $qb->getQuery()->getResult();

然后在同一个控制器中(检查响应为空等...),然后渲染到树枝模板:

return $this->render(
    'search/show_boats.html.twig',
    array('boats' => $boat_results,)
);

然后,您可以轻松地在twig模板中执行实体所需的各种事情。我在下面使用一个例子,因为你没有告诉我们你想做什么。

{# app/Resources/views/search/show_boats.html.twig #}
{% extends 'base.html.twig' %}
{% block body %}
    <h1>Boats Found:</h1>
    <p>Application Environment: {{ app.environment }}</p>
    <table>
        <tr>
            <th>Boat name</th><th>Amenity</th>
        </tr>
        {% for b in boats %}
            <tr>
                <td>{{ b.getName }}</td>
                <td>
                    {% for amen in b.getAmenities %}
                    {{ amen.getItem }}
                </td>
            </tr>
        {% endfor %}{# b #}
    </table>
{% endblock %}

希望这有助于您入门。我使用实际代码来完成类似的事情。另外,我没有显示上面的任何表单代码,因为我不知道你想做什么。