Symfony2 - DocumentChoiceList和MongoDB

时间:2011-12-18 10:18:26

标签: mongodb symfony doctrine-orm

当我尝试制作带有收藏品的表单时,我遇到了问题。我向你解释我目前的情况。

我创建了两个基本对象:产品类别。我也为它们创建了两种类型: 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'                    
            ))
    ; 
    

    }

  3. 我已尝试过所有内容,而最准确的半解决方案是将 ProductType 类别属性创建为< em> document 并通过来自控制器的绑定数据选择选项。

    关键是,使用此解决方案,选项控件的 ids 是在 UnitOfWork类中设置的 spl_object_hash ,而不是原始类别对象 ID

    我以前的尝试:

    1. 我在没有先前选择的情况下使用文档时没有问题,但我只想要Product所拥有的类别。

    2. 当我使用集合来显示类别列表(关联 CategoryType )时,我没有问题,但我没有&#39 ; t知道如何将其显示为选择控件。

    3. 我无法在类别类上使用 query_builder ,因为我无法仅查询具有产品ID X的对象,因为类别对象没有任何产品参考(这是正确的)。

    4. 有没有人有解决这个问题或其他想法的解决方案?

      非常感谢, 瑞奇。

2 个答案:

答案 0 :(得分: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()
}

答案 1 :(得分:0)

这不是问题。问题是当你在MongoDB中使用嵌入式文档时。

当您使用这些类型的文档时,Doctrine asume(使用正确的逻辑)表示您不会在其他集合中对此嵌入文档进行“手动”引用。

是的,这似乎是逻辑,但是......为什么你不能在其他集合中引用其他扩展版本的简化嵌入文档?在我看来,这是一个错误。

正如我在我的问题中所解释的那样,ODM使用对象的哈希值而不是使用ID anotation来生成id。因此,您可以明智地指出所有选项,但您的ID将与您的嵌入ID不同。

再次感谢你, 瑞奇。