没有相关实体Symfony 2的Doctrine选择实体

时间:2015-05-27 14:17:26

标签: symfony doctrine-orm

我有一个实体,卖家已将实体映射到它,客户。我想选择我的卖家来更新它的字段,但它会进行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为它找到的每个客户端实体执行此操作,就不会点击数据库。

有更好的方法吗?

1 个答案:

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

感谢。