在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
目前我的表单构建器看起来像这样。这会正确显示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'
));
}
}
答案 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 %}
希望这有助于您入门。我使用实际代码来完成类似的事情。另外,我没有显示上面的任何表单代码,因为我不知道你想做什么。