在 Symfony-Sonata 中,所有字段都是可排序的,除了一个

In Symfony-Sonata all fields are sortable except for one

Sonata 中,我创建了几个列表,并且一切正常。 (请注意,那是不久前的事了,所以我可能在那里做了一些事情,解决了我将在此处描述的问题...)。

现在我已经创建了一个新的播放列表实体列表:

如图所示,"Id" 列和 "Aangemaakt op" 列都是可排序的,但 "Playlist" 列不是。

"Aangemaakt op" 和 "Playlist" 字段都是 日期字段 ,但由于 "Aangemaakt op" 字段是可排序的,我会说与它无关。

我一直在搜索 Sonata 文档、Google 和 Whosebug,但没有找到有关此问题的任何线索。我确实找到了关于根据实体字段对列表进行排序的帖子,但我的字段不是实体。

相关代码:

/**
 * @param ListMapper $listMapper
 */
protected function configureListFields(ListMapper $listMapper) {
    $listMapper
        ->add('id')
        ->add('playlist_date', 'date', array('label' => 'Playlist'))
        ->add('created', 'datetime', array('label' => 'Aangemaakt op'))
        ->add(
            '_action', 'actions', array(
                'actions' => array(
                    'delete' => array(),
                )
            )
        );
}

一些 Whosebug 线程和下面的答案提到将 'sortable' => true 添加到必须可排序的字段。

这样做确实使该列可单击以进行排序,但单击它会导致以下异常:

Catchable Fatal Error: Argument 1 passed to
Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery::entityJoin() 
must be of the type array, null given, called in
/path/of/my/project/sonata-project/doctrine-orm-admin-bundle/Datagrid/ProxyQuery.php
on line 142 and defined.

根据其他 Whosebug 线程,这是因为必须创建连接。但是,该字段只是与其他字段相同的 Mysql 记录的一个字段。我确实找到了一个 Whosebug 线程也提到了这一点,并且他们在其中加入了相同的记录以使其工作,但我没有让它工作。此外,我感谢这不应该是对列内容进行排序的方式。

有人知道吗?

更新以响应 Hibatallah Aouadni 的回答

按照 Hibatallah 的建议,我将以下内容添加到我的 PlaylistsAdmin 中:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper
        ->add('id')
        ->add('playlist_date')
        ->add('created');
}

这导致出现以下错误消息:

Notice: Undefined index: playlist_date

所以我检查了我的实体,发现它有一个 UniqueConstraint:

uniqueConstraints={@ORM\UniqueConstraint(name="playlist_date", columns={"playlist_date"})}

它没有实际的 "index" 定义,但当然是。但是作为测试,我添加了以下内容:

, indexes={@ORM\Index(name="playlist_date", columns={"playlist_date"})}

这并没有给出任何不同的结果。 所以还是一点运气都没有:(

** 实体和实体管理员 **

实体管理员:

<?php

namespace Company\AdminBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\AdminBundle\Route\RouteCollection;

class PlaylistsAdmin extends Admin
{
    protected $baseRoutePattern = 'playlists';
    protected $baseRouteName = 'playlists';

    protected function configureRoutes(RouteCollection $collection) {
        $collection->clearExcept(array('list', 'delete', 'show'));
    }

    /**
     * @param ListMapper $listMapper
     */
    protected function configureListFields(ListMapper $listMapper) {
        $listMapper
            ->add('id')
            ->add('playlist_date', 'date', array('label' => 'Playlist'))
            ->add('created', 'datetime', array('label' => 'Aangemaakt op'))
            ->add(
                '_action', 'actions', array(
                'actions' => array(
                    'show' => array(),
                    /*'edit' => array(),*/
                    'delete' => array(),
                )
            )
            );
    }

    public function getBatchActions() {
        return array();
    }
}

实体:

<?php

namespace Company\AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Playlist
 *
 * @ORM\Table(name="playlist", uniqueConstraints={@ORM\UniqueConstraint(name="playlist_date", columns={"playlist_date"})})
 * @ORM\Entity()
 */
class Playlist
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="playlist_date", type="date", nullable=true)
     */
    protected $playlistDate;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="created", type="datetime", nullable=true)
     */
    protected $created;

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    protected $video;

    /**
     * Constructor
     */
    public function __construct() {
        $this->video = new \Doctrine\Common\Collections\ArrayCollection();
        $this->setCreated(new \DateTime());
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Set playlistDate
     *
     * @param \DateTime $playlistDate
     * @return Playlist
     */
    public function setPlaylistDate($playlistDate) {
        $this->playlistDate = $playlistDate;

        return $this;
    }

    /**
     * Get playlistDate
     *
     * @return \DateTime
     */
    public function getPlaylistDate() {
        return $this->playlistDate;
    }

    /**
     * Set created
     *
     * @param \DateTime $created
     * @return Playlist
     */
    public function setCreated($created) {
        $this->created = $created;

        return $this;
    }

    /**
     * Get created
     *
     * @return \DateTime
     */
    public function getCreated() {
        return $this->created;
    }

    /**
     * Add video
     *
     * @param \Company\AppBundle\Entity\Video $video
     * @return Playlist
     */
    public function addVideo(\Company\AppBundle\Entity\Video $video) {
        $this->video[] = $video;

        return $this;
    }

    /**
     * Remove video
     *
     * @param \Company\AppBundle\Entity\Video $video
     */
    public function removeVideo(\Company\AppBundle\Entity\Video $video) {
        $this->video->removeElement($video);
    }

    /**
     * Get video
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getVideo() {
        return $this->video;
    }
}

您需要做的就是将参数 sortable 添加到 array 和 true 作为值:

->add('playlist_date', 'date', array(
   'label' => 'Playlist',
   'sortable' => true
))

尝试在实体管理员的 configureDatagridFilters 中添加播放列表字段:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper
        ->add('id')
        ->add('playlist_date')
        ->add('created');
}

它会起作用 ;)

终于找到了,太荒谬了,在configureListFields方法中,你必须用它的名字而不是DataBase的名字来调用属性,所以:

改变

->add('playlist_date', 'date', array('label' => 'Playlist'))

->add('playlistDate', 'date', array('label' => 'Playlist'))

:D 真不敢相信我们花了这么多时间来犯一些荒谬的错误 ;)