SONATA MY ADMIN : TypeError: trim() expects parameter 1 to be string, object given

SONATA MY ADMIN : TypeError: trim() expects parameter 1 to be string, object given

我目前正在网站上工作,我必须在后台使用 Sonata Admin。我正在将项目从 symfony 3 升级到 symfony 4,当我尝试过滤实例化实体时遇到问题。

我是这样配置过滤器的:


    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper->add('name',null , [], EntityType::class, array(
            'class' => Universe::class,
            'choice_label' => 'name',
        ));
    }

它在下拉列表中很好地引用了现有的 Universe 实体(按照我的要求显示了它们的名称)。自己看看:

dropdown filter

但是当我尝试使用该列表中的名称进行实际过滤时,我收到了错误消息:

TypeError: trim() expects parameter 1 to be string, object given

我查看了互联网,并根据我在文档中找到的内容,我完全按照他们的方式配置了过滤器(来源:https://symfony.com/doc/current/bundles/SonataAdminBundle/getting_started/the_list_view.html#filtering-by-category)。

你知道我做错了什么吗?除了找到错误,我不知道还能提供什么...

非常感谢!

编辑

我也不明白的是,如果我要过滤的 属性 是一个外键,它就像一个魅力。例如这里的 jobid 是 Job 实体的外键,而我们在另一个实体下。

        $datagridMapper->add('jobId', null, array('label' => 'Section'), EntityType::class, array(
            'class'    => 'App\Entity\Admin\Job',
            'choice_label' => 'name',
        ));

考虑到这一点,我不明白为什么它不起作用。

第二次编辑

堆栈跟踪:

TypeError:
trim() expects parameter 1 to be string, object given

  at vendor/sonata-project/doctrine-orm-admin-bundle/src/Filter/StringFilter.php:33
  at trim(object(Collection))
     (vendor/sonata-project/doctrine-orm-admin-bundle/src/Filter/StringFilter.php:33)
  at Sonata\DoctrineORMAdminBundle\Filter\StringFilter->filter(object(ProxyQuery), 'o', 'name', array('type' => null, 'value' => object(Collection)))
     (vendor/sonata-project/doctrine-orm-admin-bundle/src/Filter/Filter.php:33)
  at Sonata\DoctrineORMAdminBundle\Filter\Filter->apply(object(ProxyQuery), array('type' => null, 'value' => object(Collection)))
     (vendor/sonata-project/admin-bundle/src/Datagrid/Datagrid.php:155)
  at Sonata\AdminBundle\Datagrid\Datagrid->buildPager()
     (vendor/sonata-project/admin-bundle/src/Datagrid/Datagrid.php:292)
  at Sonata\AdminBundle\Datagrid\Datagrid->getForm()
     (vendor/sonata-project/admin-bundle/src/Controller/CRUDController.php:135)
  at Sonata\AdminBundle\Controller\CRUDController->listAction()
     (vendor/symfony/http-kernel/HttpKernel.php:151)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
     (vendor/symfony/http-kernel/HttpKernel.php:68)
  at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
     (vendor/symfony/http-kernel/Kernel.php:198)
  at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
     (public/index.php:25)

上次编辑

以防将来搜索类似内容的人。

我结束了这样的事情:

        $datagridMapper->add('name','doctrine_orm_string' , array(), ChoiceType::class,
            array('choices' => $this->getAllByFieldService->fetchAllDistinctBy(Action::class, 'name')) );

使用我自己的 fetchAllDistinctBy 方法创建我需要的选择列表。

如果我理解正确,你想根据同一实体的字段过滤实体?

namespace App\Admin;

use App\Entity\Category;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;

final class UniverseAdmin extends AbstractAdmin
{
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
            ->add('title')
            ->add('name',null , [], EntityType::class, [
                'class' => Universe::class,
                'choice_label' => 'name',
            ])
        ;
    }
}

恐怕这行不通。您应该创建一个包含“名称”字段的实体,并在名称实体和正确的实体之间创建关系。