使用具有外键的复合键的原则2不会更新集合

时间:2016-06-15 11:52:49

标签: collections orm doctrine foreign-keys composite-key

我尝试了类似" Use-Case 3: Join-Table with Metadata"的内容。 我已经使用过" Cart"," Item"和" CartItem"对象。

我收到$cart->getItems();等项目。

我们假设有4个项目。现在,我删除了一个项目$items->remove(1);以删除项目。

$items->count()告诉我一个项目已被删除(它说3)。另外,当查看代码时,我看到该集合已经改变。

因此,当我冲洗时,我希望CartItem将被删除,坚果没有任何反应。即使我再次添加项目,如$cart->setItems($items);,也不会在刷新时发生任何事情。

删除项目应该是直截了当的,不是吗?我做错了什么?

修改编辑修改

即使是正常的"关键它没有用。我创建了一些新对象:

/**
 * @Entity
 * @Table(name="Soups")
 **/
class Soup {

    /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     **/
    protected $id;

    /**
     * @Column(type="string", length=50)
     */
    protected $name;

    /**
     * @OneToMany(targetEntity="SoupIngredient", mappedBy="soup", cascade={"persist"});
     */
    protected $soupIngredients;

    public function __construct() {

        $this->soupIngredients = new ArrayCollection();
    }

    public function getId() {

        // Return id.
        return $this->id;
    }

    public function getName() {

        // Return value.
        return $this->name;
    }

    public function setName($value) {

        // Set value.
        $this->name = $value;

        // Return.
        return $this;
    }

    public function getSoupIngredients() {

        // Return value.
        return $this->soupIngredients;
    }

    public function setSoupIngredients($value) {

        // Set value.
        $this->soupIngredients = $value;

        // Return.
        return $this;
    }
}

成分

/**
 * @Entity
 * @Table(name="Ingredients")
 **/
class Ingredient {

    /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     **/
    protected $id;

    /**
     * @Column(type="text", length=50)
     */
    protected $name;

    /**
     * @OneToMany(targetEntity="SoupIngredient", mappedBy="ingredient", cascade={"persist"});
     */
    protected $soupIngredients;

    public function __construct() {

        $this->soupIngredients = new ArrayCollection();
    }

    public function getId() {

        // Return id.
        return $this->id;
    }

    public function getName() {

        // Return value.
        return $this->name;
    }

    public function setName($value) {

        // Set value.
        $this->name = $value;

        // Return.
        return $this;
    }

    public function getSoupIngredients() {

        // Return value.
        return $this->soupIngredients;
    }

    public function setSoupIngredients($value) {

        // Set value.
        $this->soupIngredients = $value;

        // Return.
        return $this;
    }
}

SoupIngredients

/**
 * @Entity
 * @Table(name="SoupIngredients")
 **/
class SoupIngredient {

    /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     **/
    protected $id;

    /**
     * @Column(type="float")
     */
    protected $quantity;

    /**
     * @ManyToOne(targetEntity="Soup", inversedBy="soupIngredients")
     */
    protected $soup;

    /**
     * @ManyToOne(targetEntity="Ingredient", inversedBy="soupIngredients")
     */
    protected $ingredient;

    public function __construct() {
    }

    public function getId() {

        // Return id.
        return $this->id;
    }

    public function getQuantity() {

        // Return value.
        return $this->quantity;
    }

    public function setQuantity($value) {

        // Set value.
        $this->quantity = $value;

        // Return.
        return $this;
    }

    public function getSoup() {

        // Return value.
        return $this->soup;
    }

    public function setSoup($value) {

        // Set value.
        $this->soups = $value;

        // Return.
        return $this;
    }

    public function getIngredient() {

        // Return value.
        return $this->ingredient;
    }

    public function setIngredient($value) {

        // Set value.
        $this->ingredient = $value;

        // Return.
        return $this;
    }
}

我得到一个有{5}成分的Soup对象。

// Get Soup #1.
$em->getRepository("Soup")->find(1);

// Get ingredients.
$ingredients = $soup->getIngredients();

// Remove ingredient #2.
$ingredients->remove(2);

// Well, let's flush.
$em->flush();

什么都没发生。我可以使用SoupIngredient删除$em,但我想在函数($soup->removeIngredient($ingredient))中使用它,因此我并不总是$em可用。实现此目的的唯一方法是使用$em->remove($soupIngredient)(然后它将在刷新时更新)。

1 个答案:

答案 0 :(得分:0)

没关系! orphanRemoval=true就像魔法......

愚蠢的我!