Cześć,
Mam mały problem z usuwaniem relacji OneToMany, Mam 2 encje
MenuItemTranslation
/**
* @ORM\Entity()
* @ORM\Table(name="custom_menu_item_translation")
*/
class MenuItemTranslation
{
use Traits\UniqueIdTrait;
/**
* @ORM\ManyToOne(targetEntity="MenuItem", inversedBy="translations")
* @ORM\JoinColumn(name="menu_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
protected MenuItem $menu;
/**
* @return MenuItem
*/
public function getMenu(): MenuItem
{
return $this->menu;
}
/**
* @param MenuItem $menu
*
* @return MenuTranslation
*/
public function setMenu(MenuItem $menu): self
{
$this->menu = $menu;
return $this;
}
}
MenuItem
<?php
/**
* @ORM\HasLifecycleCallbacks()
* @ORM\Table(name="custom_menu_items")
* @ORM\Entity(repositoryClass="WebApi\API\Repository\MenuItemRepository")
*/
class MenuItem
{
/**
* @var Collection|MenuItemTranslation[]
*
* @ORM\OneToMany(targetEntity="MenuItemTranslation", cascade={"persist","remove"}, orphanRemoval=true, mappedBy="menu")
*/
protected ?Collection $translations = null;
public function __construct()
{
$this->translations = new ArrayCollection();
}
/**
* @return MenuItemTranslation[]|Collection
*/
public function getTranslations()
{
return $this->translations;
}
/**
* @param MenuItemTranslation $translation
* @return $this
*/
public function addTranslation(MenuItemTranslation $translation): self
{
if (!$this->translations->contains($translation)) {
$this->translations[] = $translation;
}
return $this;
}
/**
* @param MenuItemTranslation $translation
* @return $this
*/
public function removeTranslation(MenuItemTranslation $translation): self
{
if ($this->translations->contains($translation)) {
$this->translations->removeElement($translation);
}
return $this;
}
}
Metoda do usuwania translacji z menu
public function removeMenuItemTranslation(MenuItemTranslation $menuItemTranslation, MenuItem $menuItem)
{
$menuItemTranslations = $menuItem->getTranslations();
unset($menuItemTranslations[array_key_first([$menuItemTranslation])]);
$menuItem->setTranslations($menuItemTranslations);
return $this->menuItemRespository->updateMenuItem($menuItem);
}
metoda do aktualizacji MenuItem
public function updateMenuItem(MenuItemModel $menuItem): ?MenuItemModel
{
try {
$transformedMenu = $this->menuItemTransformer->transform($menuItem);
$transformedMenuItem = $this->getEntityManager()->merge($transformedMenu);
$this->getEntityManager()->flush($transformedMenuItem);
$this->getEntityManager()->detach($transformedMenuItem);
return $this->menuItemTransformer->transform($transformedMenuItem);
} catch (Exception $e) {
throw new RepositoryException($e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine());
}
}
I teraz tak, mam MenuItem który ma przypisane 2 translacje, jedną z nich usuwam. I w poniższych linijkach pozakuje mi MenuItem z jednym językiem, tym który chcę zostawić
$transformedMenu = $this->menuItemTransformer->transform($menuItem);
$transformedMenuItem = $this->getEntityManager()->merge($transformedMenu);
Natomiast linijkę niżej tzn
$this->getEntityManager()->flush($transformedMenuItem);
pokazuje mi znowu 2 tłumaczenia, to które chce zostawić i usunąć. Podczas aktualizacji, nie pokazuje mi żadnego błędu, ale też nie usuwa rekordu z bazy. Ktoś ma jakiś pomysł? Cały kod umieściłem powyżej.
Testuję w taki sposób
$menuItem = $this->menuService->getMenuItem($id);
$menuItemTranslation = $this->menuService->getMenuItemTranslation(2, $menuItem);
$menuItem->removeTranslation($menuItemTranslation);
$this->menuService->updateMenuItem($menuItem);
Nie ważne, czy użyję z entity removeTranslation czy z serwisu removeMenuItemTranslation, efekt jest ten sam tzn brak błędu i nie usuwa rekordy.
Jakieś pomysły? Bo mi już ich zabrakło.