我有一个实体SearchFieldType
,ManyToMany
到SearchOperator
:
/**
* @ORM\ManyToMany(targetEntity="SearchOperator", cascade={"persist", "remove"})
* @ORM\JoinTable(
* joinColumns={@ORM\JoinColumn(name="type_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="operator_id", referencedColumnName="id")}
* )
**/
private $operators;
在表单类型中,默认设置会显示一个选择控件,其中包含所有现有运算符,而我只想显示该实体的当前可用运算符。这是我的(失败的)尝试,因为我读到我需要创建一个事件监听器(我吗?)才能访问相关的实体:
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$formFactory = $builder->getFormFactory();
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formFactory)
{
$form = $event->getForm();
$data = $event->getData();
if ($data != null)
{
$form
->add($formFactory->createNamed('name', 'text', array('auto_initialize' => false)))
->add($formFactory->createNamed('operators', 'entity', array('class' => 'AppBundle:SearchOperator',
'multiple' => false,
'expanded' => false,
'choices' => $data->getOperators())))
;
}
});
}
我收到此错误:
仅在根表单上支持自动初始化。您应该在字段“name”上将“auto_initialize”选项设置为false。
我尝试在字段和表单本身(setDefaultOptions
)中将此选项设置为false,但没有结果。
我目前的symfony版本是2.7.6
答案 0 :(得分:0)
在"winningPlan" : {
"stage" : "PROJECTION",
"transformBy" : {
"headers.From" : 1,
"_id" : 0
},
"inputStage" : {
"stage" : "FETCH",
"filter" : {
"headers.Date" : {
"$gt" : ISODate("2001-04-01T05:00:00Z")
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"headers.From" : 1
},
"indexName" : "headers.From_1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"headers.From" : [
"[MinKey, MaxKey]"
]
}
}
}
的{{1}}上,您已经映射了多对多的关系。我假设下面的表单是$operators
。
因为你有一个ManyToMany关系,这意味着你的表单希望在'运算符'的输入中有很多值。但是,您将字段类型设置为' entity'。这些不兼容。如果,正如您所说,您只需要一个下拉列表,那么您可能希望将关系更改为ManyToOne。 (如果您想保留ManyToMany,您必须将表单类型设置为' collection')。
您遇到的其他错误:
仅在根表单上支持自动初始化。你应该设置" auto_initialize"字段上的选项为false" name"。
将通过从字段"名称'中删除此选项来解决此问题。据我所知:
SearchFieldType
然后,在将关系修复为ManyToOne之后,您可以使用SearchFieldType
选项传递一个QueryBuilder实例,其中包含一些查询过滤器(我甚至不理解您要过滤的注释)对于'实体'字段类型(see here)。