如何在 SonataAdmin Doctrine2 PHPCR Admin 中按父文档进行过滤

How to filter by parent document in SonataAdmin Doctrine2 PHPCR Admin

这是我在 SymfonyCMF 上的第一个简单项目。 在我的项目中,我有很多 'profile' 文档(就 phpcr 而言)。每个配置文件属于特定的 'department'(父文档)。 (在 phpcr 中,每个文档都必须有父文档。) 在管理面板 (SonataAdmin) 中,我可以使用 configureListFields 函数列出所有 'profiles'。我可以使用 configureDatagridFilters 函数按 'profile' 属性过滤它们。 但是,无法弄清楚如何通过其父 'department' 文档过滤 'profile'。

        protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
            ->add('name','doctrine_phpcr_string')
            ->add('title', 'doctrine_phpcr_string')
            ->add('parent') <--- Need to filter  by parent !
          ;
    }

试图从 SonataAdmin 实现自定义回调过滤器函数 documentation:

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper

            ->add('parent', 'doctrine_phpcr_callback', array(
                'callback' => function($queryBuilder, $alias, $field, $data) {
                    if (!$data || !is_array($data) || !array_key_exists('value', $data)) {
                        return;
                    }

                    $queryBuilder = $proxyQuery->getQueryBuilder();
                    $eb = $queryBuilder->expr();

                    $queryBuilder->andWhere($eb->eq($field, $data['value']));

                    return true;
                },
                'field_type' => 'checkbox'
            ))
        ;
    }

但是,首先我收到一个与 $proxyQuery、$queryBuilder->expr() 相关的错误。其次,我不知道如何按父级正确查询和过滤 ((. 提前致谢。

解决了@Bilel Noômene 最终答案是

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{

    $datagridMapper->add('parent', 'doctrine_phpcr_callback', array('callback' =>
        function ($proxyQuery, $alias, $field, $data) {
            if (!$data || !is_array($data) || !array_key_exists('value', $data) || !$data['value']) {
                return;
            }


            $queryBuilder = $proxyQuery->getQueryBuilder();

            $queryBuilder->from($alias)
                ->joinInner()
                ->left()->document(Profile::class, $alias)->end()
                ->right()->document(Department::class, 'd')->end()
                ->condition()->child($alias, 'd')->end();

            $queryBuilder->andWhere()->same($data['value']->getId(), 'd')->end();

            return true;
        }
    ), DocumentType::class, array('class'=>Department::class));

    parent::configureDatagridFilters($datagridMapper);
}

文档示例似乎没有正常运行。对于您的情况,请尝试此代码。

public function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper->add('parent', 'doctrine_phpcr_callback', array('callback' =>
        function ($proxyQuery, $alias, $field, $data) {
            if (!$data || !is_array($data) || !array_key_exists('value', $data) || !$data['value']) {
                return;
            }

            $queryBuilder = $proxyQuery->getQueryBuilder();

            $queryBuilder->from($alias)
                ->joinInner()
                ->left()->document(Profile::class, $alias)->end()
                ->right()->document(Department::class, 'd')->end()
                ->condition()->child($alias, 'd')->end();
            $queryBuilder->andWhere()->same($data['value']->getId(), 'd')->end();

            return true;
        }
    ), 'phpcr_document', array('class' => Department::class));

    parent::configureDatagridFilters($datagridMapper);
}