当我尝试制作带有收藏品的表单时,我遇到了问题。我向你解释我目前的情况。
我创建了两个基本对象:产品和类别。我也为它们创建了两种类型: ProductType,CategoryType 。
我有3个类别和1个产品,并且我已将前几个类别与产品相关联。因此,该产品有两个相关的类别。
我想创建产品表格。在这种形式中,我想在html选择控件中仅显示产品所具有的类别,因此用户可以使用这些数据进行将来的操作。
我总结了关键点。
我的产品类有
class Product
{
...
@EmbedMany(targetDocument="Acme\StoreBundle\Document\Category")
protected $categories;
...
}
在 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 的类别属性创建为< em> document 并通过来自控制器的绑定数据选择选项。
关键是,使用此解决方案,选项控件的 ids 是在 UnitOfWork类中设置的 spl_object_hash ,而不是原始类别对象的 ID 。
我以前的尝试:
我在没有先前选择的情况下使用文档时没有问题,但我只想要Product所拥有的类别。
当我使用集合来显示类别列表(关联 CategoryType )时,我没有问题,但我没有&#39 ; t知道如何将其显示为选择控件。
我无法在类别类上使用 query_builder ,因为我无法仅查询具有产品ID X的对象,因为类别对象没有任何产品参考(这是正确的)。
有没有人有解决这个问题或其他想法的解决方案?
非常感谢, 瑞奇。
答案 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不同。
再次感谢你, 瑞奇。