[英]Doctrine - ManyToMany relationship with deleting
我需要在兩個實體之間創建ManyToMany
關系。 接下來,我嘗試刪除一些行,但是它不起作用。 沒有錯誤發生,沒有數據庫刪除-沒有-好像從未啟動過。 你能幫我嗎?
瓷磚實體
<?php
namespace AppBundle\Entity;
use AppBundle\Traits\Timestampable;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* ORM\Entity(repositoryClass="AppBundle\Entity\Repository\TileRepository")
* @ORM\Table(name="tile")
*
*/
class Tile
{
/**
* @var int
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column(type="string", nullable=false)
*/
protected $type;
/**
* @var string
* @ORM\Column(type="string", nullable=false)
*/
protected $name;
/**
* @var string
* @ORM\Column(type="string", nullable=true)
*/
protected $start;
/**
* @var string
* @ORM\Column(type="string", nullable=true)
*/
protected $end;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\User", inversedBy="tiles", cascade={"remove", "persist"})
* @ORM\JoinTable(name="users_tiles")
**/
protected $user;
/**
* Constructor
*/
public function __construct()
{
$this->user = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set type
*
* @param string $type
*
* @return Tile
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* Get type
*
* @return string
*/
public function getType()
{
return $this->type;
}
/**
* Set name
*
* @param string $name
*
* @return Tile
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set start
*
* @param string $start
*
* @return Tile
*/
public function setStart($start)
{
$this->start = $start;
return $this;
}
/**
* Get start
*
* @return string
*/
public function getStart()
{
return $this->start;
}
/**
* Set end
*
* @param string $end
*
* @return Tile
*/
public function setEnd($end)
{
$this->end = $end;
return $this;
}
/**
* Get end
*
* @return string
*/
public function getEnd()
{
return $this->end;
}
/**
* Add user
*
* @param \AppBundle\Entity\User $user
*
* @return Tile
*/
public function addUser(\AppBundle\Entity\User $user)
{
$this->user[] = $user;
return $this;
}
/**
* Remove user
*
* @param \AppBundle\Entity\User $user
*/
public function removeUser(\AppBundle\Entity\User $user)
{
$this->user->removeElement($user);
}
/**
* Get user
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getUser()
{
return $this->user;
}
}
用戶實體
<?php
// src/AppBundle/Entity/User.php
namespace AppBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="fos_user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Group")
* @ORM\JoinTable(name="fos_user_user_group",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
* )
*/
protected $groups;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Tile", mappedBy="user")
*/
protected $tiles;
/**
* Add tile
*
* @param \AppBundle\Entity\Tile $tile
*
* @return User
*/
public function addTile(\AppBundle\Entity\Tile $tile)
{
$this->tiles[] = $tile;
return $this;
}
/**
* Remove tile
*
* @param \AppBundle\Entity\Tile $tile
*/
public function removeTile(\AppBundle\Entity\Tile $tile)
{
$tile->setUser(null);
$this->tiles->removeElement($tile);
}
/**
* Get tiles
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTiles()
{
return $this->tiles;
}
}
和控制器類的一部分
$user = $this->getUser();
foreach($user->getTiles() as $tile) {
echo $tile->getName();
$user->removeTile($tile);
}
$em->persist($user);
$em->flush();
另外,我正在嘗試使用以下方法添加新記錄:
foreach($data as $tile) {
$user->addTile($em->getReference('AppBundle:Tile', $tile));
}
$em->persist($user);
$em->flush();
但這也行不通。 沒有發生錯誤,沒有數據庫插入。
您的用戶似乎是相反的一面,而圖塊則是其擁有的一面。 因此,反面的更新不會反映您的更新。 嘗試切換擁有方或在更新時更新磁貼。
參見學說文檔 :
反面必須使用OneToOne,OneToMany或ManyToMany映射聲明的maptedBy屬性。 mappingBy屬性包含擁有方的關聯字段的名稱。 擁有方必須使用OneToOne,ManyToOne或ManyToMany映射聲明的inversedBy屬性。 inversedBy屬性包含反側的關聯字段的名稱。
和
原則將僅檢查關聯的擁有方以進行更改。
要完全理解這一點,請記住在對象世界中如何維護雙向關聯。 關聯的每一側都有2個引用,這2個引用都表示相同的關聯,但可以彼此獨立地進行更改。 當然,在正確的應用程序中,雙向關聯的語義由應用程序開發人員正確維護(這是他的責任)。 教義需要知道這兩個內存引用中的哪一個是應該持久的,哪些不是。 這就是擁有/反向概念的主要用途。
僅對關聯的反面所做的更改將被忽略。 確保更新雙向關聯的雙方(或者從Doctrine的角度來看至少更新擁有方)
雙向關聯的擁有方是Doctrine在確定關聯的狀態時“關注”的一面,因此,在數據庫中是否有任何事情可以更新關聯。
“擁有方”和“相反方”是ORM技術的技術概念,而不是域模型的概念。 在域模型中,您認為擁有權的一方可能不同於Doctrine擁有權的一方。 這些無關。
正如@ k0pernikus所說 ,僅從一側是可能的。 因此,如果您想同時使用它,則需要修改逆實體。
所以從:
/**
* Add tile
*
* @param \AppBundle\Entity\Tile $tile
*
* @return User
*/
public function addTile(\AppBundle\Entity\Tile $tile)
{
$this->tiles[] = $tile;
return $this;
}
/**
* Remove tile
*
* @param \AppBundle\Entity\Tile $tile
*/
public function removeTile(\AppBundle\Entity\Tile $tile)
{
$this->tiles->removeElement($tile);
}
至
/**
* Add tile
*
* @param \AppBundle\Entity\Tile $tile
*
* @return User
*/
public function addTile(\AppBundle\Entity\Tile $tile)
{
$tile->addUser($this);
return $this;
}
/**
* Remove tile
*
* @param \AppBundle\Entity\Tile $tile
*/
public function removeTile(\AppBundle\Entity\Tile $tile)
{
$this->tiles->removeElement($tile);
$tile->removeUser($this);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.