Sonata admin - “排序依据”相关表中的字段

发布于 2024-12-27 04:58:15 字数 306 浏览 3 评论 0原文

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

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

如果字段位于实体本身上,则设置要排序的默认字段很容易(请参阅 Sonata 管理捆绑顺序< /a> 了解如何执行此操作)。但我不知道如何按相关表中的字段进行排序。

任何帮助表示赞赏。

I have a Product admin class. The Product entity has a many-to-one relationship with a Category entity, i.e. a product is associated with a category.

In the admin "list" page for products, I need to sort by the category name (alphabetically) that each product is associated with.

Setting the default field to sort by is easy if the field is on the entity itself (see Sonata admin bundle order for how to do this). But I cannot figure out how to sort by a field in a related table.

Any help is appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

暮年 2025-01-03 04:58:15

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

<?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'));
    }
}

It seems a workaround, but it works. You have to add a join overriding createQuery() method, than assign a default sortBy overriding $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'));
    }
}
疯到世界奔溃 2025-01-03 04:58:15

假设 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();
}

Asume name is the property of entity Category by wich you want to sort. You may do this in you ProductAdmin.php

protected function configureListFields(ListMapper $listMapper)
{

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

This way you leverage the ordering links in the header of the list, generated by Sonata.

Edit

If you would also like to have a link on the category name in products list to quickly edit the Category entity, assuming you have created a CategoryAdmin class, you should write your code like this:

protected function configureListFields(ListMapper $listMapper)
{

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

And in your Category class you should implement the __toString() method like this:

public function __toString()
{
    return $this->getName();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文