表单提交调用在ManyToOne上缓慢的SQL查询

时间:2014-07-24 17:54:35

标签: symfony

因为我添加了许多"城市"在我的数据库中,我的所有后端都减慢了表单提交速度。 当我提交包含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;

谢谢

1 个答案:

答案 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);
                }
            )
        )

希望这有帮助