Symfony2实体到数组

时间:2012-11-09 14:54:25

标签: arrays forms symfony entity

我正在尝试将我的平面php项目迁移到Symfony2,但它变得非常困难。 例如,我有一个产品规格表,它有多个规格,并且可以通过Extraspecs DB表中的“cat”属性进行区分。 因此,我为该表创建了一个实体,并希望使用“cat”= 0 ...

创建一个只有规范的数组。

我认为代码就是这个......对吧?

$typeavailable = $this->getDoctrine()
        ->getRepository('LabsCatalogBundle:ProductExtraspecsSpecs')
        ->findBy(array('cat' => '0'));

现在我怎么能把它放在一个数组中来处理这样的表格?:

form = $this ->createFormBuilder($product)
->add('specs', 'choice', array('choices' => $typeavailableArray), 'multiple' => true)  

提前谢谢你:)

谢谢大家..

但现在我遇到了另一个问题.. 实际上我正在从现有对象构建表单:

$form = $this ->createFormBuilder($product)
                ->add('name', 'text')
                ->add('genspec', 'choice', array('choices' => array('0' => 'None', '1' => 'General', '2' => 'Specific')))
                ->add('isReg', 'choice', array('choices' => array('0' => 'Material', '1' => 'Reagent', '2' => 'Antibody', '3' => 'Growth Factors', '4' => 'Rodents', '5' => 'Lagomorphs')))

所以..在那种情况下,我的当前值被命名为“extraspecs”,所以我添加了这个:

->add('extraspecs', 'entity', array(
                        'label'          => 'desc',
                        'empty_value'    => ' --- ',
                        'class'          => 'LabsCatalogBundle:ProductExtraspecsSpecs',
                        'property'       => 'specsid',
                        'query_builder'  => function(EntityRepository $er) {
                            return $er ->createQueryBuilder('e');

但是“extraspecs”来自oneToMany的关系,其中每个产品都有几个额外规格...

这是ORM:

Labs\CatalogBundle\Entity\Product:
    type: entity
    table: orders__regmat
    id:
        id:
            type: integer
            generator: { strategy: AUTO }
    fields:
        name:
            type: string
            length: 100
        catnumber:
            type: string
            scale: 100
        brand:
            type: integer
            scale: 10
        company:
            type: integer
            scale: 10
        size:
            type: decimal
            scale: 10
        units:
            type: integer
            scale: 10
        price:
            type: decimal
            scale: 10
        reqcert:
            type: integer
            scale: 1
        isReg:
            type: integer
            scale: 1
        genspec:
            type: integer
            scale: 1

    oneToMany:
        extraspecs:
            targetEntity: ProductExtraspecs
            mappedBy: product

Labs\CatalogBundle\Entity\ProductExtraspecs:
    type: entity
    table: orders__regmat__extraspecs

    fields:
        extraspecid:
            id: true
            type: integer
            unsigned: false
            nullable: false
            generator:
                strategy: IDENTITY
        regmatid:
            type: integer
            scale: 11
        spec:
            type: integer
            scale: 11
        attrib:
            type: string
            length: 20
        value:
            type: string
            length: 200

    lifecycleCallbacks: {  }


    manyToOne:
      product:
        targetEntity: Product
        inversedBy: extraspecs
        joinColumn:
            name: regmatid
            referencedColumnName: id

我应该这样做吗?

谢谢!!!

3 个答案:

答案 0 :(得分:4)

从数据库返回的值已经在数组中。

您可以使用entity field type创建所需的表单 这是它的工作原理:

$form = $this->createFormBuilder($product)
    ->add('specs', 'entity', array(
        'class' => 'LabsCatalogBundle:ProductExtraspecsSpecs',
        'choices' => $typeavailable,
        'property' => 'specsid',
        'multiple' => true,
    ))->getForm();

替换目标实体(ProductExtraspecsSpecs)中要在表单中显示的字段的property属性。

如果您仍然不清楚某些事情,请询问,我会尝试提供更多信息。

要选择当前对象,请执行以下操作:
在控制器中:$selected = $product->getExtraspecs();

在表单构建器中:

$form = $this->createFormBuilder($product)
    ...
    ->add('specs', 'entity', array(
        'data' => $selected,
        ...
    ))->getForm();

答案 1 :(得分:1)

您可以使用小部件formBuilder直接在entity中请求对象。以下示例显示了一些基本属性,其中:

  • label很明显
  • empty_value也很明显
  • class是您要从中选择的完全限定的实体
  • property是列表中显示的类成员(用户看到的内容)
  • data是当前选择的,如果您有学说关系(例如 OneToMany
  • query_builder最后允许您指定选择应在列表中显示哪些元素(在您的示例中“cat为0”)

总之,你得到这个:

$builder ->add('entity', 'entity', array(
            'label'          => 'Choose from this list',
            'empty_value'    => 'This is a blank value on top of the list',
            'class'          => 'VendorNameBundle:Entity',
            'property'       => 'name',
            'data'           => $currentObject->getEntity(),
            'query_builder'  => function(EntityRepository $er) {
                return $er ->createQueryBuilder('e')
                           ->groupBy('e.id')
                           ->orderBy('e.name', 'ASC');
        }
));

您可以在此处详细了解:

Entity Field Type

答案 2 :(得分:0)

您可以使用Serializer Component将您的Doctrine实体转换为数组。