Symfony3 Form Type和ManyToMany关系

时间:2018-04-25 07:19:31

标签: symfony

如何配置多对多关系的表单类型?

以下配置......

窗体/类型/ ProductType.php

$builder
    ->add('name')
    ->add('price')
    ->add('description', TextareaType::class)
    ->add('quantity')
    ->add('shopProductImages', EntityType::class, [
        'class'        => 'AppBundle:ShopProductImages',
        'choice_label'=>'file',
        'query_builder' => function (EntityRepository $repo) {
            return $repo->createQueryBuilder('f')
                ->where('f.id > :id')
                ->setParameter('id', 1);
        },

    ])

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => ShopProducts::class,
    ]);
}

实体/ ShopProducts.php

/**
 * @ORM\Table(name="shop_products")
 * @ORM\Entity
 */
class ShopProducts
{
    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\ShopProductImages", mappedBy="shopProducts")
     */
    private $shopProductImages;

实体/ ShopProductImages.php

 * @ORM\Table(name="shop_product_images")
 * @ORM\Entity
 */
class ShopProductImages
{
    /**
     * @var string
     *
     * @ORM\Column(name="file", type="text", length=255, nullable=true)
     */
    private $file;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_mod", type="datetime", nullable=true)
     */
    private $dateMod;

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\ShopProducts", inversedBy="shopProductImages")
     * @ORM\JoinTable(name="shop_product_images_has_shop_products",
     *   joinColumns={
     *     @ORM\JoinColumn(name="shop_product_images_id", referencedColumnName="id")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="shop_products_id", referencedColumnName="id")
     *   }
     * )
     */
    private $shopProducts;

...以错误结束 image

1 个答案:

答案 0 :(得分:1)

首先ManyToMany有多个选项:

所以你需要deternmine这是你的情况?它是单向/双向的,并使用正确的方法

你也可以考虑一下学说中非常好的建议:

  

为什么多对多关联不太常见?因为经常你   想要将其他属性与关联相关联,其中   你介绍一个关联类的情况。因此,直接   多对多关联消失并被替换为   3个参与者之间的一对多/多对一关联   类。

至于你的错误,一些代码片段丢失了,但是错误解释了它:你有一个等待路径的文件对象 - 应该是一个字符串 - 你给它一个对象 - 可能你是传递整个文件 - 看看你的ShopController以查看文件属性的设置位置,你可以调试错误而不看代码我猜它会是这样的

setFile($fileObject)

您需要更改为

setFile($fileObject->getPath());

否则我需要查看代码以便修复它。