因为我添加了许多"城市"在我的数据库中,我的所有后端都减慢了表单提交速度。 当我提交包含ManyToOne字段(此处为:city)的表单时,Symfony会执行SQL查询:
SELECT t0.id AS id1, .... FROM city t0
当我提交请求时
$form->submit($request);
我的实体已保存,此处没问题。所以我的问题是:为什么Symfony在没有哪里条件的情况下调用一个查询,其中有40k +数据的表?如何避免这种无用的查询?
有关信息,请
$form->getForm();
它打电话(如预期的那样)
SELECT t0.id AS id1, ... FROM city t0 WHERE t0.id = 392
我的表格:
$form = $this->get('form.factory')->createNamedBuilder('receiver', 'form', $receiver)
->add('city', 'entity',
array(
'class' => 'SensiCofcBundle:City',
'required' => true
)
);
$form = $form->getForm(); // Ok "Select * from city WHERE id=392"
if ($request->isMethod('POST') || $request->isMethod('PUT'))
$form->submit($request); // Slow "Select * from city"
我的实体:
/**
* @var array
*
* @ORM\ManyToOne(targetEntity="A\B\Entity\City")
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
* @Expose
*/
private $city;
谢谢
答案 0 :(得分:0)
好的,所以Symfony执行完整的SQL查询“SELECT * FROM entity”以填充视图中的[select / radio / checkboxes]。
在我的情况下,我通过外部ajax填充我的html元素。所以我使用“query_builder”参数来显示相同的选项:
->add('city', 'entity',
array(
'class' => 'Bundle:City',
'required' => false,
'query_builder' => function() {
$qb = $this->em->getRepository('Bundle:City')->createQueryBuilder('c');
$qb->where('c.enabled=1');
return ($qb);
}
)
)
希望这有帮助