具有大量行的SonataAdmin sonata_type_model抛出OutOfMemoryException

时间:2016-11-23 14:25:06

标签: symfony sonata-admin

我有一个简单的一对多关系清单 - >预订数千个房源。 当我添加以下SonataAdmin类时:

class BookingAdmin extends Admin
{
...

   $formMapper
     ->add(
        'listing',
         null,
         array(
            'disabled' => true,
         )
     ),
...

由于列表数量众多,因此抛出了OutOfMemoryException。 我想知道如何通过在不使用选择列表的情况下在表单中显示列表标题来避免此错误。

2 个答案:

答案 0 :(得分:1)

您可以为这些案例使用'sonata_type_model_autocomplete'表单类型(Ref.):

class BookingAdmin extends AbstractAdmin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        // the dropdown autocomplete list will show only Booking
        // entities that contain specified text in "title" attribute
        $formMapper->add('listing', 'sonata_type_model_autocomplete', array(
            'property' => 'title'
        ));
    }
}

这个避免查询所有行以填充小部件。

答案 1 :(得分:0)

我找到了另一种解决方案而不是Yonel。 在此解决方案中,我们仅在选择小部件中获取持久预订实体的当前列表。只有在不得更改列表时才有用。

class BookingAdmin extends Admin
{
    ...

    protected function configureFormFields(FormMapper $formMapper)
    {
         $listing= $this->getSubject();

         $formMapper
            ->add(
                'listing',
                'sonata_type_model',
                 array(
                    'query' => $this->modelManager
                        ->getEntityManager('Bundle:Listing')
                        ->getRepository('Bundle:Listing')
                        ->find(
                            $listing->getId()
                        ),
                    'disabled' => true,
                )
            );
          ...