2017-05-04 100 views
0

我试图使用窗体将图像URL存储到数据库。与symfony ManyToOne的关系在数据库中存储图像URL

我有2个实体:

产品& ProductImages。

产品与ProductImages具有OneToMany关系,并且 ProductImages与产品具有ManyToOne关系。

产品:

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

+0

它必须是产品图片的数组,你必须改为传递对象数组 – Eimsas

回答

1

setImages需要一个图像数组实体。不是文件名。所以你必须用这个文件名创建一个新的实体,或者用这个文件名找到一个现有的Image实体。

这也将是创建addImage有用的,在你的产品实体删除图像

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

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

的单个对象,我得到这个错误,当我尝试传递一个带有productImages实体的数组:'通过关联'AppBundle \ Entity \ Product#images'找到一个新实体,该实体未配置为级联实体test.jpeg的持久化操作。要解决这个问题:在这个未知实体上显式调用EntityManager#persist()或配置级联在映射中持久化这个关联,例如@ManyToOne(..,cascade = {“persist”})。' – Refilon

+0

你需要持久化新创建的实体。如果你在一个控制器中:$ this-> getDoctrine() - > getManager() - > persist($ imageEntity);您只需要在新创建的实体上执行此操作。如果您正在更新现有实体,则不需要调用persist方法。您也可以使用注释来允许级联持续存在,但我并没有太多使用它们。 – Carlos

+0

卡洛斯不工作....我已经这样做了,这就是为什么我得到错误。当我使用合并($产品)它的工作原理,但它不会保存到数据库。 – Refilon