簡體   English   中英

原則-與刪除的ManyToMany關系

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM