2017-05-04 102 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