我有一个实体,卖家已将实体映射到它,客户。我想选择我的卖家来更新它的字段,但它会进行260次查询(查看查询,我看到它选择了所有它的客户端和客户端其他映射实体)。
我只需要卖家对象,以获得最佳性能。我有什么想法来优化我的查询?
我的卖家如下:return $this->findOneBy(array('hash' => $hash));
我发现问题是什么,当我创建表单时,我会执行以下操作
$builder->add('url')
->add('theme', null, array('error_bubbling' => true))
->add('demo_link_client', 'entity', array(
'required' => false,
'class' => 'MyProject\MyBundle\Entity\Client',
'property' => 'email',
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')->where('c.seller = 1');
},
'label' => 'Demo Data Set',
'empty_value' => 'Auto select demo data',
'empty_data' => null))
一旦Doctrine为它找到的每个客户端实体执行此操作,就不会点击数据库。
有更好的方法吗?
答案 0 :(得分:0)
有一种更好的方法可以做到这一点。 查询客户端的数据库(在选择框中显示其名称......)并具有:
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')->where('c.seller = 1');
},
在FormType内,Doctrine查询“where”语句中找到的每个客户端的数据库。这是一个非常糟糕的想法,但是如果你只有6-10行回来则很难注意到。
<强>改进:强>
我应该在Controller中获取数据并将其传递给FormType:
$demo_data = $this->getDoctrine()->getRepository('MyProjectMyBundle:Client')->findBy(array('seller' => 1));
//pass data to FormType
$form = $this->createForm(new SellerType(),$seller, array('demo_data' => $demo_data));
在FormType中:
$demo = $options['demo_data'];
->add('demo_link_client','entity',array(
'required' => false,
'class' => 'MyProject\MyBundle\Entity\Client',
'property' => 'email',
'data' => $demo,
'label' => 'Demo Data Set',
'empty_value' => 'Auto select demo data',
'empty_data' => null))
感谢。