插入关联表

时间:2015-01-23 17:40:37

标签: php mysql codeigniter

假设我有table1和table2,每个都有一个带有动态输入字段的表单,用于向这些表插入数据。通常我会直接获取最后一个插入ID以将其插入到单个表的外键中,但现在我处理两个表,加上动态输入字段,并且不知道如何将它们插入多对多关系的关联表。我在考虑将最后一个插入ID存储在一个数组中,但我的想法在那里停止了,我甚至都不确定。

table1
------
t1_id (pk)
desc

assoctable
------
status
t1_id (fk)
t2_id (fk)


table2
------
t2_id (pk)
attrb

更新:我没有包含我的代码,但就是这样。到目前为止,它们确实可以正常工作,并且可以将用户输入插入到数据库中。

查看

<input type="text" class="form-control" name="desc[]" id="row1">
<input type="text" class="form-control" name="attrib[]" id="row2">
<button type="button" class="btn btn-default" onclick="addRow1()">Add Row</button>
<button type="button" class="btn btn-default" onclick="addRow2()">Add Row</button>

控制器:

$descs = $this->input->post('desc');
$attrbs = $this->input->post('attrb');

foreach($descs as $key => $val){
    $fields = array(
        'desc' => $val
    );
    $table1_result = $this->model_test->insert_table1($fields);
}
foreach($attrbs as $key => $val){
    $fields = array(
        'attrb' => $val
    );
    $table2_result = $this->model_test->insert_table2($fields);
}

型号:

function insert_table1($data) {
    $this->db->insert('table1', $data);
}
function insert_table2($data) {
    $this->db->insert('table2', $data);
}

2 个答案:

答案 0 :(得分:1)

您正在使用某种ORM,其中每个对象代表特定表中的实体。要执行您要执行的操作,您需要实现一个事务,通过提交所有查询或不提交任何查询来确保数据一致性。以下是一些通用代码,可帮助您走上正确的道路:

// HUGE CAVEAT! This assumes that $desc and $attr arrays are aligned

try {

    $this->db->startTransaction();

    foreach ($descriptions as $key => $description) {

        $table1 = new Table1;
        $table2 = new Table2;
        $linkingTable = new LinkingTable;

        $table1->setDescription($description);

        $table1->save();

        $table2->setAttribute($attributes[$key]);

        $table2->save();

        // Here is where the magic happens, notice that are making a call to getId on both objects, so even though the transaction hasn't committed yet, the database has allocated us the ids
        $linkingTable->setTable1Id($table1->getId());
        $linkingTable->setTable2Id($table2->getId());

        $linkingTable->save();
    }

    $this->db->commit();

} catch (Exception $e) {

    error_log(sprintf('Exception: %s', $e->getMessage()));

    $this->db->rollback();
}

- 参考评论 -

不知道你的表单是如何设置的,但通常一个表单应该代表一个主要对象,能够通过联结(或我喜欢称之为链接表)将其他对象链接到它。

以书店为例。您可以创建一个表格,您可以将书籍保存到商店,作为表单的一部分,您可以与多位作者共同撰写本书。当你保存表格时,这本书只是一个对象,所以你不必担心数组对齐b / c你只有一个数组,作者。

如果您无法按照书籍/作者示例设置表单,那么从理论上讲,您可以通过关联每个表单元素(如descs[1])来对齐您的键,并确保assocs[1]对齐,因此当您提交时表格,我给出的前一个例子应该有用。

答案 1 :(得分:0)

这就是我想出的。感谢Mike先生给我的启发。在每次插入后,我分别存储了两个ID的最后一个ID。

$table1_id = array();

foreach($descs as $key => $val){
   $fields = array(
       'desc' => $val
);
   $table1_result = $this->model_test->insert_table1($fields);
   $table1_id[] = $this->model_test->getlastid();
}

table2具有相同的代码。然后这就是我将它们插入到联结表中的方式。

foreach($table1_id as $key => $val) {
    foreach($table2_id as $key2 => $val2) {
        $field = array(
            'status' => '0',
            't1_id' => $val2,
            't2_id' => $val
        );
        $result = $this->model_admin->insert_assoctable($field);
    }
}