Symfony 2.7:EntityType - 在查询构建器中强制没有结果
Symfony 2.7 : EntityType - force no result in query builder
我没有找到 post 来解决我的问题,希望它不是重复的。
在 Symfony 表单中,我声明了一个 entity 字段。
$form->add($builder->getFormFactory()->createNamed(
'cert_folder_product_factory',
new EntityMultipleType(),
null,
array(
'label' => '',
'mapped' => false,
'class' => 'ProductsBundle:ProductFactory',
'empty_value' => '',
'auto_initialize' => false,
'required' => false,
'label_controls' => array('add' => 'Add Product', 'remove' => 'Remove Product'),
)
));
我希望这个字段在开始时有一个空的实体集合,因为该集合基于另一个字段值,所以我不放任何 query_builder 参数声明。
$form->add($builder->getFormFactory()->createNamed(
'supplier_list',
'entity',
null,
array(
'mapped' => false,
'label' => ' ',
'class' => 'SuppliersBundle:Suppliers',
'empty_value' => '',
'auto_initialize' => false,
'required' => false,
'data' => $data->getSupplierProduct(),
'query_builder' => function(\Ella\SuppliersBundle\Repository\SuppliersRepository $er) {
return $er->createQueryBuilder('q')->andWhere('q.is_delete = 0')->orderBy('q.name', 'asc');
})
)
);
一旦 supplier_list 字段有值,AJAX 查询检索关联的元素并填充 [=48 的集合=] 字段.
为了在提交时验证表单并按照建议进行验证,我声明了 PRE_SUBMIT EventListener 来填充字段集合并验证我的用户选择的值
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($builder, $container) {
$data = $event->getData();
$form = $event->getForm();
if (!$data['supplier_list']) {
return;
}
$supplierId = $data['supplier_list'];
$form->add($builder->getFormFactory()->createNamed(
'cert_folder_product_factory',
new EntityMultipleType(),
null,
array(
'label' => '',
'mapped' => false,
'class' => 'ProductsBundle:ProductFactory',
'empty_value' => '',
'auto_initialize' => false,
'required' => false,
'label_controls' => array('add' => 'Add Product', 'remove' => 'Remove Product'),
'query_builder' => function(\Ella\ProductsBundle\Repository\ProductFactoryRepository $er) use ($supplierId) {
return $er->getProductBySupplier($supplierId);
},
)
)
);
});
一旦我为 supplier_list 字段和表单提交设置了值,一切正常。但是,正如 Symfony 文档对 query_builder 所解释的那样,query_builder 参数的默认行为是加载所有实体,从而使加载时间非常长。
我的解决方法是强制加载一个任意实体
'query_builder' => function (\Ella\ProductsBundle\Repository\ProductFactoryRepository $er) {
return $er->createQueryBuilder('q')->setMaxResults(1);
}
但是这个解决方案是完全错误的,有什么正确的方法可以强制实体集合首先加载 0 个实体吗?
非常感谢您的帮助。
仅供参考,简单的做法是将 null
作为 $supplierId
参数的值传递,不会检索任何结果(仅当您在 setParameter()
中传递您的值时才有效您的查询生成器)。
我还添加了一个 formModifier,如 https://symfony.com/doc/2.7/form/dynamic_form_modification.html#form-events-user-data 中所述,以避免在不同的字段中复制/粘贴相同的字段 EventListener
$formModifier = function (FormInterface $form, $supplierId = null, $productFactories = null) {
$form->add('cert_folder_product_factory', new EntityMultipleType(),
array(
'label' => '',
'mapped' => false,
'class' => 'ProductsBundle:ProductFactory',
'empty_value' => '',
'auto_initialize' => false,
'required' => false,
'label_controls' => array('add' => 'Add Product', 'remove' => 'Remove Product'),
'query_builder' => function(\Ella\ProductsBundle\Repository\ProductFactoryRepository $er) use ($supplierId) {
return $er->getProductBySupplier($supplierId);
},
'data' => (count($productFactories) > 0) ? $productFactories : null,
)
);
};
在PRE_SET_DATA声明字段
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifier, $builder, $container) {
$formModifier($form,
($data->getSupplierProduct()) ? $data->getSupplierProduct()->getId() : null,
(count($data->getProductFactory())) ? $data->getProductFactory() : null
);
}
然后在PRE_SUBMIT中验证表单提交
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifier) {
$data = $event->getData();
$form = $event->getForm();
$formModifier($form,
array_key_exists('supplier_list', $data) ? $data['supplier_list'] : null
);
});
我没有找到 post 来解决我的问题,希望它不是重复的。
在 Symfony 表单中,我声明了一个 entity 字段。
$form->add($builder->getFormFactory()->createNamed(
'cert_folder_product_factory',
new EntityMultipleType(),
null,
array(
'label' => '',
'mapped' => false,
'class' => 'ProductsBundle:ProductFactory',
'empty_value' => '',
'auto_initialize' => false,
'required' => false,
'label_controls' => array('add' => 'Add Product', 'remove' => 'Remove Product'),
)
));
我希望这个字段在开始时有一个空的实体集合,因为该集合基于另一个字段值,所以我不放任何 query_builder 参数声明。
$form->add($builder->getFormFactory()->createNamed(
'supplier_list',
'entity',
null,
array(
'mapped' => false,
'label' => ' ',
'class' => 'SuppliersBundle:Suppliers',
'empty_value' => '',
'auto_initialize' => false,
'required' => false,
'data' => $data->getSupplierProduct(),
'query_builder' => function(\Ella\SuppliersBundle\Repository\SuppliersRepository $er) {
return $er->createQueryBuilder('q')->andWhere('q.is_delete = 0')->orderBy('q.name', 'asc');
})
)
);
一旦 supplier_list 字段有值,AJAX 查询检索关联的元素并填充 [=48 的集合=] 字段.
为了在提交时验证表单并按照建议进行验证,我声明了 PRE_SUBMIT EventListener 来填充字段集合并验证我的用户选择的值
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($builder, $container) {
$data = $event->getData();
$form = $event->getForm();
if (!$data['supplier_list']) {
return;
}
$supplierId = $data['supplier_list'];
$form->add($builder->getFormFactory()->createNamed(
'cert_folder_product_factory',
new EntityMultipleType(),
null,
array(
'label' => '',
'mapped' => false,
'class' => 'ProductsBundle:ProductFactory',
'empty_value' => '',
'auto_initialize' => false,
'required' => false,
'label_controls' => array('add' => 'Add Product', 'remove' => 'Remove Product'),
'query_builder' => function(\Ella\ProductsBundle\Repository\ProductFactoryRepository $er) use ($supplierId) {
return $er->getProductBySupplier($supplierId);
},
)
)
);
});
一旦我为 supplier_list 字段和表单提交设置了值,一切正常。但是,正如 Symfony 文档对 query_builder 所解释的那样,query_builder 参数的默认行为是加载所有实体,从而使加载时间非常长。
我的解决方法是强制加载一个任意实体
'query_builder' => function (\Ella\ProductsBundle\Repository\ProductFactoryRepository $er) {
return $er->createQueryBuilder('q')->setMaxResults(1);
}
但是这个解决方案是完全错误的,有什么正确的方法可以强制实体集合首先加载 0 个实体吗?
非常感谢您的帮助。
仅供参考,简单的做法是将 null
作为 $supplierId
参数的值传递,不会检索任何结果(仅当您在 setParameter()
中传递您的值时才有效您的查询生成器)。
我还添加了一个 formModifier,如 https://symfony.com/doc/2.7/form/dynamic_form_modification.html#form-events-user-data 中所述,以避免在不同的字段中复制/粘贴相同的字段 EventListener
$formModifier = function (FormInterface $form, $supplierId = null, $productFactories = null) {
$form->add('cert_folder_product_factory', new EntityMultipleType(),
array(
'label' => '',
'mapped' => false,
'class' => 'ProductsBundle:ProductFactory',
'empty_value' => '',
'auto_initialize' => false,
'required' => false,
'label_controls' => array('add' => 'Add Product', 'remove' => 'Remove Product'),
'query_builder' => function(\Ella\ProductsBundle\Repository\ProductFactoryRepository $er) use ($supplierId) {
return $er->getProductBySupplier($supplierId);
},
'data' => (count($productFactories) > 0) ? $productFactories : null,
)
);
};
在PRE_SET_DATA声明字段
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifier, $builder, $container) {
$formModifier($form,
($data->getSupplierProduct()) ? $data->getSupplierProduct()->getId() : null,
(count($data->getProductFactory())) ? $data->getProductFactory() : null
);
}
然后在PRE_SUBMIT中验证表单提交
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifier) {
$data = $event->getData();
$form = $event->getForm();
$formModifier($form,
array_key_exists('supplier_list', $data) ? $data['supplier_list'] : null
);
});