0

我正在尝试将我的平面 php 项目迁移到 Symfony2,但它变得非常困难。例如,我有一个 Products 规范表,它有几个规范,并且可以通过 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');

但是“额外规格”来自 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

我该怎么做?

谢谢!!!

4

3 回答 3

4

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

您可以使用实体字段类型来创建您想要的表单。
这是它的工作原理:

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

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

如果您仍有不清楚的地方,请询问,我会尽力提供更多信息。

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

在表单生成器中:

$form = $this->createFormBuilder($product)
    ...
    ->add('specs', 'entity', array(
        'data' => $selected,
        ...
    ))->getForm();
于 2012-11-09T15:58:28.127 回答
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');
        }
));

你可以在这里读更多关于它的内容:

实体字段类型

于 2012-11-09T15:57:59.427 回答
0

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

于 2012-11-09T15:56:58.380 回答