从关联表PHP中删除记录

时间:2011-12-05 02:59:03

标签: php database codeigniter activerecord

我正在研究多对多表格,我修复了一个无法提取记录的问题。现在我正在尝试在需要时删除记录。

我有一个网站,儿童可以与某个活动相关联。如果孩子被意外添加,我希望能够移除孩子。它们通过Checkbox添加如下:

<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
            ));
        }
    }
}

提交表单后,我会收到一个返回信息,它会抓取eventChildren匹配的eventId表中的所有记录。

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

我希望这是有道理的。 :)

2 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题(更好的方法),但我只是根据你提供的信息给出一个直截了当的答案。

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

答案 1 :(得分:0)

为了清楚起见,你要删除两个项目之间的关系(即从多对多表中删除)?

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