【问题标题】:Sonata Admin custom query in configureListFieldsconfigureListFields 中的 Sonata Admin 自定义查询
【发布时间】:2016-01-22 11:07:25
【问题描述】:

我被困了几个小时。

我有管理类来列出所有类别,并且在一个表列中有相关产品(产品实体):Table example 相关代码:

protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
            ->addIdentifier('name')
            ->add('products') // Entity Product, @ORM\OneToMany
            ->add('ord')
    ;
}

我需要做的是根据“(布尔)product.active”隐藏非活动产品,但我无法弄清楚。我知道“createQuery”方法,但它不起作用。当我生成 SQL 并直接运行查询时,它可以工作,但在这里看起来我只能使用 ProxyQuery 来过滤类别,然后在单独的查询中查询所有产品(这个单独的查询我不知道如何更改)。

public function createQuery($context = 'list')
{
    $query = parent::createQuery($context);

    $q = new ProxyQuery($query->join(sprintf('%s.products', $query->getRootAlias()), 'p')
            ->andWhere('p.active = :act')->setParameter('act', true));

    return $q;
}

感谢您的帮助

【问题讨论】:

    标签: php symfony sonata-admin


    【解决方案1】:

    您可以将字段的类型更改为 null 或实体并添加 query_builder option 以适应使用的查询:

    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('name')
            ->add('products', null, array(
                'query_builder' => function(EntityRepository $er) {
                     return $er->createQueryBuilder('qb')
                               ->leftjoin('qb.products', 'p')
                               ->where('p.active = :act')
                               ->setParameter('act', true)
                 }
         ));
    }
    

    我没有使用 oneToMany 关系对其进行测试。

    这个topic里面有一些信息

    【讨论】:

    • 感谢您的回复,但我仍然无法正常工作。看起来“query_builder”不知何故未使用。我试过 put die();在那个函数中,什么也没发生。
    • 确保包含 EntityRepository 的整个路径,而不仅仅是名称:) 它对我来说就像一个魅力
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 2018-07-22
    • 2018-12-25
    • 2017-09-02
    • 2012-11-16
    • 2013-12-19
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多