I have a problem with doctrine sortable extension.
first of all, i have a House entity with 1:n Releation to HouseImage entity (setup to save the image postion) and a HouseImage entity 1:1 releation to File entity.
class House
{
/**
* @var HouseImage[]|Collection
*
* @ORM\OneToMany(
* targetEntity="HouseImage",
* mappedBy="houses",
* cascade={"persist", "remove"},
* orphanRemoval=true
* )
* @ORM\OrderBy({"position" = "ASC"})
*/
protected $images;
}
/**
* HouseImage
*
* @ORM\Table(name=house_image)
* @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
*/
class HouseImage {
/**
* @var House
*
* @ORM\ManyToOne(
* targetEntity="House",
* inversedBy="images",
* )
* @ORM\JoinColumn(
* name="house_id",
* referencedColumnName="id",
* onDelete="SET NULL"
* )
* @Gedmo\SortableGroup
*/
protected $houses;
/**
* @var File
*
* @ORM\OneToOne(
* targetEntity="File",
* )
*
* @ORM\JoinColumn(
* name="image_id",
* referencedColumnName="id",
* nullable=false,
* )
*/
protected $image;
/**
* @var integer
*
* @Gedmo\SortablePosition
* @ORM\Column(name="position", type="integer")
*/
protected $position;
....
}
//so i create some HouseImage-Objects
$HouseImage = new HouseImage();
$HouseImage->setImage($myFile);
$HouseImage2 = new HouseImage();
$HouseImage2->setImage($myFile2);
$HouseImage3 = new HouseImage();
$HouseImage3->setImage($myFile3);
//add first image-relation to house
$house->setImages([$HouseImage]);
$em->persist($house);
$em->flush();
//add second image-relation, should be inserted at first position
$house->setImages([$HouseImage2, $HouseImage]);
$em->persist($house);
$em->flush();
//add new list of image-relation
$house->setImages([$HouseImage2, $HouseImage3]);
$em->persist($house);
$em->flush();
///after flush the entitymanager this error occurred
An exception occurred while executing 'INSERT INTO house_image (position, house_id, image_id) VALUES (?, ?, ?)' with params [0, 123, 999]:\n
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '999' for key 'UNIQ_E0C3790C3DA5256D
the some error occurred with form factory
$data['images'] = [
[
'house' => 181,
'image' => 123
],
[
'house' => 181,
'image' => 1234
],
[
'house' => 181,
'image' => 12345
],
];
$form = $formFactory->create(HouseType::class, $houseObject);#
$form->submit($data, false);
Question: How can i update the HouseImage-postion in the list by add a list of HouseImage or How can i cleanup all entites befor insert a complete new list of HouseImage-Releations
Edit: I have fixed my issue by removing the addImage() method an implement this setImage() Method:
public function setImages(Collection $images): void
{
$col = new ArrayCollection();
$i = 0;
/* @var $image HouseImage */
foreach ($images as $image) {
$image->setHouse($this);
$image->setPosition($i++);
$col->add($image);
}
$this->images = $col;
}