سؤال

لدي كيان جماعي مع عضو في الفصل التالي ورسم الخرائط:

/**
 * @ManyToMany(targetEntity="Group", cascade={"persist"})
 * @JoinTable(name="groups_children",
 *      joinColumns={@JoinColumn(name="group_id", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="child_id", referencedColumnName="id", unique=true)}
 *      )
 */
private $children;

إضافة طفل تافهة:

public function addChild(Group $group)
{
    if (! $this->hasChild($group)) {
        $this->children[] = $group;
        App::getEntityManager()->persist($this);
    }
}

إزالة الطفل:

???????

كيف يمكنني إزالة طفل؟

هل كانت مفيدة؟

المحلول

عندما يسترجع العقيدة قائمة القيم من العلاقة ، فإنها تستخدم مثيلًا ArrayCollection على عكس صفيف منتظم.

ArrayCollection ينفذ ArrayAccess ، مما يعني ذلك unset يعمل على ما يرام.

ومع ذلك ، فإن طريقة أبسط للقيام بذلك ستكون:

   $this->getChildren()->removeElement($child) // to remove by object
   $this->getChildren()->remove($index) // to remove by array index

على الرغم من أنني في حيرة من أمري مع مثالك الحالي. لماذا تفترض أن معرف الطفل ومعرف المجموعة يجب أن يكون متطابقًا في جدول الانضمام؟ ولماذا تضيف مثالك في إضافة $group إلى $children[] مجموعة مصفوفة؟ لا تعني أن تكون حرجًا ، ولكنه يجعل تحليل نيتك أمرًا صعبًا.

نصائح أخرى

public function removeChild(Group $group)
{
    foreach ($this->getChildren() as $key => $child)
    {
        if ($child->getId() == $group->getId())
            unset($this->children[$key]);
            break;
    }
}

هذا يعمل. هل هي الطريقة الأكثر كفاءة رغم ذلك؟

استخدم ArrayCollection :: removeElement

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top