如何在 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);
}
这是我在 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);
}