使用symfony ManyToOne关系将图像URL存储在数据库中

时间:2017-05-04 10:15:52

标签: php forms symfony

我正在尝试使用表单将图像URL存储到数据库中。

我有两个实体:

产品& ProductImages。

产品与ProductImages和。的关系是OneToMany ProductImages与Product有很多关系。

产品:

/**
 * @ORM\OneToMany(targetEntity="ProductImages", mappedBy="product")
 */
private $images;

/**
 * @return mixed
 */
public function getImages()
{
    return $this->images;
}

/**
 * @param mixed $images
 * @return $this
 */
public function setImages($images)
{
    $this->images = $images;

    return $this;
}

ProductImages:

/**
 * @ORM\ManyToOne(targetEntity="Product", inversedBy="images")
 * @ORM\JoinColumn(nullable=false)
 */
private $product;

/**
 * @return mixed
 */
public function getProduct()
{
    return $this->product;
}

/**
 * @param mixed $product
 */
public function setProduct(Product $product)
{
    $this->product = $product;
}

我制作了一个表格,上传了一个文件和这个控制器:

$product = new Product();

$form = $this->createForm(ProductFormType::class, $product);
$form->handleRequest($request);

if($form->isSubmitted() && $form->isValid()) {

    $file = $product->getImages();
    $fileName = $form->get('slug')->getData().'.'.$file->guessExtension();
    $file->move(
        $this->getParameter('product_image_directory'),
        $fileName
    );

    $product->setImages($fileName);

    $em = $this->getDoctrine()->getManager();
    $em->persist($product);
    $em->flush();

    $this->addFlash('success', 'Product aangemaakt!');

    return $this->redirectToRoute('admin_product_list');
}

我得到的错误是:

Type error: Argument 1 passed to Doctrine\Common\Collections\ArrayCollection::__construct() must be of the type array, string given, called in C:\git\symfony\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php on line 605

我已经尝试将ProductImages保存为new ProductImages();并填写所有字段,但这也不起作用。

1 个答案:

答案 0 :(得分:1)

setImages期望一组图像实体。不是文件名。因此,您必须使用该文件名创建一个新实体,或者找到具有该文件名的现有Image实体。

在您的产品实体中创建addImage并删除图像也很有用

public function addImage(Image $image){
$this->images->add($image);
}

public function removeImage(Image $image){
$this->images->removeElement($image);
}