从关联表中删除记录


Removing Records from an Associated Table PHP

我在一个多对多表工作,我修复了一个问题,我不能拉的记录。现在我正试着在需要的时候删除记录。

我有一个网站,孩子们可以关联到一个事件。在意外添加子元素的情况下,我希望能够删除该子元素。它们是通过以下复选框添加的:

<input type="checkbox" name="eventChildren[]" id="childId_12" />
<input type="checkbox" name="eventChildren[]" id="childId_13" />
<input type="checkbox" name="eventChildren[]" id="childId_14" />

如果孩子已经被添加,我有多个复选框被预先选中。

我有三个表(不确定这是否相关):

DB:
- children
- events
- eventChildren

当我保存记录,我正在做一个检查,以确保我不添加重复到我的eventChildren表。我知道如果记录已经在数据库中,但没有从表单中提交,那么孩子将被从列表中删除……我不知道如何捕捉这个子集。

示例代码:

// $eventChildren comes from the form above name="eventChildren[]"
// $eventId is passed into the function
$currentChildren = $this->eventChildren->GetEventChildren(array('eventId' => $eventId));
// Loop through all submitted children
foreach ($eventChildren as $childId)
{
    // Loop through all existing children
    foreach ($currentChildren as $currChild)
    {
        // If the child ID's do not match then it's a new record
        if ($currChild->childId != $childId)
        {
            $this->eventChildren->AddEventChildren(array(
                'eventId' => $eventId,
                'childId' => $childId
            ));
        }
    }
}

当提交表单时,我得到一个返回,从eventId匹配的eventChildren表中获取所有记录。

eventChildren (return)
- [0]
    eventChildrenId => 1
    childId => 12
    eventId => 4
- [1]
    eventChildrenId => 2
    childId => 13
    eventId => 4
- [2]
    eventChildrenId => 3
    childId => 14
    eventId => 4
submittedChildren
- [0] => 12
- [1] => 13

我怎么能说,基于submittedChildren数组删除eventChildrenId = 3所在的记录?

我希望这有意义。:)

有很多方法可以解决这个问题(更好的方法),但我将根据您提供的信息给出一个直接的答案。

$orphaned = array();
foreach ($currentChildren as $currChild) {
    if (!in_array($currChild->childId, $submittedChildren)) {
        $orphaned[] = $currChild->childId;
    }
}

只是为了清楚,您正在删除两个项目之间的关系(即从多对多表中删除)?

通常event_id和child_id字段将是关系中的标识(PRIMARY)键。因此,如果用户提交的child_id为13,并且您可以在上下文中导出event_id为4,那么从eventChildren表中删除child_id = 13和event_id = 4应该就足够了。你不需要首先收集关于eventChildren对象的信息(你已经有了标识信息)。