2011-12-18 46 views
2

我試圖用集合創建表單時遇到問題。我向你解釋我目前的情況。Symfony2 - DocumentChoiceList和MongoDB

我創建了兩個基本對象:產品類別。我也爲它們創建了兩種類型:ProductType,CategoryType

我有3個類別和1個產品,我已經將第一個幾類與產品關聯。所以,該產品有兩個關聯的類別。

我想創建產品的窗體。在這種形式下,我只想在html選擇控件中僅顯示產品的類別,以便用戶可以使用這些數據進行未來操作。

我總結了你的要點。

  1. 產品類有

    class Product 
    { 
        ... 
    
        @EmbedMany(targetDocument="Acme\StoreBundle\Document\Category") 
        protected $categories; 
    
        ... 
    
    } 
    
  2. 在我ProductType我:

    public function buildForm(FormBuilder $builder, array $options) 
    { 
        $builder->add('id') 
         ->add('name') 
         ->add('price') 
         ->add('categories', 'document', array(
          'class' => 'Acme\StoreBundle\Document\Category', 
          'choices' => $builder->getData()->getCategories()->toArray(), 
          'multiple' => 'true', 
          'property' => 'name'      
         )) 
    ; 
    

    }

我已經試過一切,最準確的半解是創造類別ProductType屬性作爲文件並選擇通過綁定數據來自控制器的選項。

的一點是,在該溶液中的IDS,選項控制的,都是在的UnitOfWork類,而不是IDS原始類別對象spl_object_hash集。

我以前tryings:

  1. 我沒有問題,當我使用的文檔,而以前的選擇,但我想只有產品擁有的類別。

  2. 我沒有問題,當我使用收集顯示類別列表(關聯的CategoryType),但我不知道如何表達這是一個選擇控制。

  3. 我不能使用query_builderCategory類因爲只有對象有產品ID X我無法查詢,因爲類別對象沒有任何產品參考(和那就對了)。

有沒有人有解決這個問題或其他想法來解決這個問題?

非常感謝, 裏奇。

回答

1

你說

我想創造產品的形式。在這種形式下,我只想在html選擇控件中僅顯示產品的類別,以便用戶可以使用這些數據進行未來操作。

但是,然後你繼續抓住所有的類別。

爲什麼不把事情簡單化並從產品對象中抓取引用的類別?

$cats = $product->getCategories();  
if(!is_null($cats) && $cats->count() > 0) { 
    $choices = $cats; 
} else { 
// grab all so you can have the use set them 
    $choices = $builder->getData()->getCategories()->toArray() 
} 
+0

對不起,我後來的答案。謝謝你的解釋。 – user957066 2012-02-08 08:31:13

0

這不是問題所在。問題是當你在MongoDB中使用Embedded Documents時。

當您使用這些類型的文檔時,Doctrine asume(使用正確的邏輯)表示您不會在其他集合中擁有對此嵌入文檔的「手動」引用。

是的,這似乎是邏輯,但是...爲什麼你不能有一個簡化的嵌入文件誰引用其他集合中的其他擴展版本?在我看來,這是一個錯誤。

正如我在我的問題中解釋的那樣,ODM使id與對象的散列不一起使用ID偏移。所以,你可以抓住所有的選項,因爲你明智地指出了,但是你的ID將和你的Embed的ID不同。

再次感謝你, 裏奇。