如何配置多对多关系的表单类型?
以下配置......
窗体/类型/ 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;
答案 0 :(得分:1)
首先ManyToMany
有多个选项:
所以你需要deternmine这是你的情况?它是单向/双向的,并使用正确的方法
你也可以考虑一下学说中非常好的建议:
为什么多对多关联不太常见?因为经常你 想要将其他属性与关联相关联,其中 你介绍一个关联类的情况。因此,直接 多对多关联消失并被替换为 3个参与者之间的一对多/多对一关联 类。
至于你的错误,一些代码片段丢失了,但是错误解释了它:你有一个等待路径的文件对象 - 应该是一个字符串 - 你给它一个对象 - 可能你是传递整个文件 - 看看你的ShopController
以查看文件属性的设置位置,你可以调试错误而不看代码我猜它会是这样的
setFile($fileObject)
您需要更改为
setFile($fileObject->getPath());
否则我需要查看代码以便修复它。