【问题标题】:Store image URL in database with symfony ManyToOne relations使用 symfony ManyToOne 关系将图像 URL 存储在数据库中
【发布时间】:2017-05-04 10:15:51
【问题描述】:

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

我有 2 个实体:

产品和产品图片。

Product 与 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;
}

产品图片:

/**
 * @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(); 并填写所有字段,但这也不起作用。

【问题讨论】:

  • 它必须是产品图像数组,您必须传递单个对象而不是对象数组

标签: php forms symfony


【解决方案1】:

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

在您的 Product 实体中创建 addImage 和删除图像也很有用

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

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

【讨论】:

  • 当我尝试使用 productImages 实体传递数组时出现此错误:A new entity was found through the relationship 'AppBundle\Entity\Product#images' that was not configured to cascade persist operations for entity: test.jpeg. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).
  • 您需要持久化新创建的实体。如果您在控制器中: $this->getDoctrine()->getManager()->persist($imageEntity);您只需对新创建的实体执行此操作。如果要更新现有实体,则无需调用 persist 方法。也可以使用注解来让级联持久化,不过我用的不多。
  • 不起作用卡洛斯....我已经这样做了,这就是我收到错误的原因。当我使用 merge($product) 时,它可以工作,但不会保存到数据库。
  • 我不使用merge方法,买你之后调用flush()?? $this->getDoctrine()->getManager()->flush()
  • 请仔细检查persist(IMAGE ENTITY),查看您的代码,我发现您保留的是$product,而不是图像实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 2019-05-07
  • 2010-10-20
  • 2014-05-04
  • 2012-10-17
相关资源
最近更新 更多