我目前正在网站上,必须使用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实体(就像我问的那样显示它们的名称)。自己看看:
但是当我尝试使用该列表中的名称进行实际过滤时,会出现该错误:
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',
])
;
}
}
恐怕这行不通。您应该创建一个包含“名称”字段的实体,并在名称实体和适当的实体之间创建关系。