2012-01-12 12 views
7

私はProduct管理クラスを持っています。 Productエンティティは、Categoryエンティティと多対1の関係を持ちます。つまり、商品はカテゴリに関連付けられています。Sonata admin - 関連テーブルの "order by"フィールド

製品の管理者リストページでは、各製品が関連付けられているカテゴリ名(アルファベット順)でソートする必要があります。

フィールドがエンティティ自体にある場合、デフォルトのフィールドを並べ替えるのは簡単です(これについては、Sonata admin bundle orderを参照してください)。しかし、私はどのように関連テーブルのフィールドで並べ替えるかを理解することはできません。

何か助けていただければ幸いです。

答えて

6

回避策のようですが動作します。

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

私はまだそれを試す必要がありますが、それは私が必要とするものと正確に思われる。ありがとうございました。 – agentar

5

Asume nameをソートしたいウィッヒによって実体Categoryのプロパティです:あなたは$ datagridValuesをオーバーライドデフォルトSORTBYを割り当てるよりも、からCreateQueryをオーバーライドjoin()メソッドを追加する必要があります。あなたはProductAdmin.php

protected function configureListFields(ListMapper $listMapper) 
{ 

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

にあなたはソナタによって生成されたリストのヘッダで注文リンクを活用し、この方法は、これを行うことがあります。

編集

あなたも、あなたがCategoryAdminクラスを作成していると仮定すると、すぐにCategoryエンティティを編集するための製品リストでカテゴリ名のリンクを持っているしたい場合は、このようなあなたのコードを書く必要があります。

protected function configureListFields(ListMapper $listMapper) 
{ 

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

そして、あなたのCategoryクラスの

は、次のような __toString()メソッドを実装する必要があります0
+0

これは 'KnpLabs/DoctrineBehaviors'変換可能な' - > add( 'name'、null、array( 'associated_property' => 'EntityTranslation'、 'sortable' => 'translations.name')) '' – kunicmarko20