产品和尺寸symfony2学说示例

时间:2016-01-27 09:21:28

标签: php symfony doctrine-orm

我是symfony2的新手,我正在建立我的第一个在线商店。我有产品,我想添加产品尺寸,一种产品可以有多种尺寸,一种尺寸可以有很多产品。例如:两种产品猫有' M'大小

class Product {
    ...
    /**
     * @ORM\ManyToMany(targetEntity="Size", inversedBy="products", cascade={"persist", "merge"})
     * @ORM\JoinTable(name="sizes")
     */
    private $sizes;
}

//in another file
class Size {
    /**
     * @ORM\ManyToMany(targetEntity="Product", mappedBy="sizes")
     */

    protected $products;
}

ProductController.php

...
            ->add('sizes', CollectionType::class, [
                'entry_type' => SizeType::class,
                'label' => 'Sizes',
                'allow_add'    => true,
            ])
...

SizeType.php

public function buildForm(FormBuilderInterface $builder, array $options) {
    $repo = $this->em->getRepository('AppBundle:Size');

    $q = $repo->createQueryBuilder('c')
            ->getQuery();

    $sizes = $q->getResult();

    $builder->add('name', EntityType::class, array(
        'class' => 'AppBundle:Size',
        'choice_label' => 'name',
    ));
}

现在我得到了 Catchable Fatal Error: Object of class AppBundle\Entity\Size could not be converted to string我可以解决,如果我实施__toString()但我不知道这是否正确,如果我这样做,在编辑产品时,下拉菜单不会t选择合适的尺寸。

我的问题是,这是将产品尺寸功能实施到网上商店的正确方法吗?

3 个答案:

答案 0 :(得分:0)

尝试使用此代码:

$builder->add('name', EntityType::class, array(
    'class' => 'AppBundle:Size',
    'choice_label' => 'name',
    'property' => 'needed_property_name' //just write the needed property name there
));

答案 1 :(得分:0)

所以我已经找到了更好的方法来实现它,'实体'类型有多个=>真

        ->add('sizes', 'entity', [
            'class' => Size::class,
            'label' => 'Размери',
            'choice_label' => 'name',
            'multiple' => true,
            'expanded' => false,
            //'allow_add'    => true,
        ])

这样可以选择多种尺寸,bootstrap-multiselect我已经看起来很漂亮,现在对我很有用。

我很想知道是否有更好的方式。

答案 2 :(得分:-2)

产品注释看起来不对。 JoinTable是多对多关系的查找表:

Lookup table

约定是在链接表之后命名:products_sizes在你的情况下:

class Product {
    ...
    /**
     * @ORM\ManyToMany(targetEntity="Size", inversedBy="products", cascade={"persist", "merge"})
     * @ORM\JoinTable(name="products_sizes")
     */
     private $sizes;
}