【问题标题】:Sonata admin - "order by" field in related tableSonata admin - 相关表中的“order by”字段
【发布时间】:2012-02-09 01:02:42
【问题描述】:

我有一个产品管理员课程。 Product 实体与 Category 实体具有多对一的关系,即产品与类别相关联。

在产品的管理“列表”页面中,我需要按与每个产品关联的类别名称(按字母顺序)排序。

如果字段位于实体本身上,则设置默认字段以进行排序很容易(请参阅Sonata admin bundle order 了解如何执行此操作)。但我不知道如何按相关表中的字段排序。

感谢任何帮助。

【问题讨论】:

  • 请查看question。它可以解决您的问题。

标签: symfony doctrine-orm admin


【解决方案1】:

假设name 是您想要排序的实体Category 的属性。你可以这样做ProductAdmin.php

protected function configureListFields(ListMapper $listMapper)
{

     $listMapper->add('category.name', null, array(
            'sortable' => true,
     ));
     ...
}

通过这种方式,您可以利用由 Sonata 生成的列表标题中的排序链接。

编辑

如果您还想在产品列表中的类别名称上有一个链接以快速编辑Category 实体,假设您已经创建了一个CategoryAdmin 类,您应该这样编写代码:

protected function configureListFields(ListMapper $listMapper)
{

     $listMapper->add('category', null, array(
            'sortable' => 'category.name',
     ));
     ...
}

在您的 Category 类中,您应该像这样实现 __toString() 方法:

public function __toString()
{
    return $this->getName();
}

【讨论】:

  • 这适用于KnpLabs/DoctrineBehaviors可翻译->add('name', null, array('associated_property' => 'EntityTranslation','sortable' => 'translations.name'))
【解决方案2】:

这似乎是一种解决方法,但它确实有效。您必须添加一个覆盖 createQuery() 方法的连接,而不是分配一个默认的 sortBy 覆盖 $datagridValues:

<?php
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;

class ExpenseAdmin extends Admin
{
    protected $datagridValues = array(
        '_page'       => 1,
        '_sort_order' => 'ASC', // sort direction
        '_sort_by' => 'c.name' // field name
    );

    /**
     * @return \Sonata\AdminBundle\Datagrid\ProxyQueryInterface
     */
    public function createQuery($context = 'list')
    {
        $query = parent::createQuery($context);

        return new ProxyQuery($query
            ->join(sprintf('%s.category', $query->getRootAlias()), 'c'));
    }
}

【讨论】:

  • 我仍然需要尝试,但它似乎正是我所需要的。谢谢。
猜你喜欢
  • 2016-07-09
  • 2015-08-27
  • 2019-04-12
  • 2016-10-11
  • 2015-11-20
  • 2023-03-23
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
相关资源
最近更新 更多