2016-05-30 27 views
1

我正在一個網站中使用一個公共屬性的許多實體。每當我想創建或更新任何這些實體時,我需要以特定的順序(按字母順序)以表單(HTML Select TAG)的形式呈現此屬性。ManyToOne OrderBy在symfony3和Doctrine中:如何在一個crud控制器中訂購EntityType表單元素

我確實記得,並不完全確定,在synfony2中,只需重寫findBy()類存儲庫方法,並在其中添加orderBy子句就足夠了,但它在symfony3中不起作用。

到acomplish這個排序依據在symfony3的唯一方法是改變buildForm方法,並添加一個query_builder選項...是這樣的:

/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('myProperty', EntityType::class, array(
      'class' => 'MyBundle:MyPropertyClass', 
      'required' => false, 
      'query_builder' => function ($er) { 
       return $er->createQueryBuilder('p')->orderBy('p.order', 'ASC'); 
     })) 

但我不喜歡的COPY &粘貼此想法代碼在每個entityFormType只是爲了排序輸入元素(EntityType)。

我確定在編輯任何EntityType字段的實體時,必須有更好的/正確的方式來排列元素(再次按字母順序排列)。 symfony2提供的解決方案在這裏不起作用。

任何人都有同樣的問題?

什麼是不工作

1.- ClassRepository的findAll()或findBy()方法 在Symfony2中,只是因爲我們需要

覆蓋在分類儲存一些方法每次選擇輸入顯示了
class MyClassRepository extends EntityRepository{ 

    public function findAll(){ 
    return $this->findBy(array(),array('myProperty' => 'ASC')); 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) 
    { 
    $orderBy = $orderBy === null ? array('myProperty' => 'ASC') : $orderBy; 
    return parent::findBy($criteria, $orderBy, $limit, $offset); 
    } 

} 

2:@OrderBy

氏s是在一個對象中排序一個屬性數組,我現在正在使用它,但在關係的另一端,我試圖找出的是如何對來自編輯動作/控制器的選擇輸入中的項進行排序而不必更改所有使用此屬性:: Class的formType類中的代碼(它類似於我的模型中隨處可見的枚舉類型,稍微澄清一點)

+0

我認爲問題是,爲什麼不使用類庫製作 – Jonos

回答

0

您可以在實體中添加一個OrderBy註釋類:

/** @Entity **/ 
class MyEntity 
{ 
    // ... 

    /** 
    * @ManyToMany(targetEntity="Property") 
    * @OrderBy({"order" = "ASC"}) 
    **/ 
    private $properties; 
} 
+1

已經嘗試此查詢...但其在關係的反面,在'@這隻能... toMany'和我需要'@ ... toOne'方面,並且完全忽略它 – Jonos

+0

你確定你的關係是在右邊嗎?在你的實體和它的屬性之間有一個OneToMany是否更合乎邏輯? – Veve

+1

不是真的,請記住我要做的事情是將選擇輸入[實體類型](http://symfony.com/doc/current/reference/forms/types/entity.html)中的元素排序爲在編輯操作中選擇一個對象。在symfony2中,所有這類查詢都是由類庫執行的......顯然不再是這樣了,或者我可能不會重寫正確的方法...... – Jonos