代码之家  ›  专栏  ›  技术社区  ›  Jacob Mulquin

Fat-Free Framework:如何使用DB\SQL\Mapper添加/修改/删除相关表的记录

  •  1
  • Jacob Mulquin  · 技术社区  · 8 年前

    大家好,我当前正在处理的表单包含相关表中的行,并且处理表单时遇到了一个挑战:在F3中,处理可能导致相关表中行被添加、修改或删除的表单的最佳方法是什么?

    数据库架构

    practitioner
    ------------------------------
    id         | int(10)
    first_name | varchar(255)
    last_name  | varchar(255)
    abn        | char(11)
    mobile     | varchar(20)
    email      | varchar(255)
    
    practice_site
    ------------------------------
    id         | int(10)
    name       | varchar(255)
    
    provider_number
    ------------------------------
    id               | int(10)
    practice_site_id | int(10)
    practitioner_id  | int(10)
    provider_number  | varchar(20)
    

    表格

    • 提供者编号是动态添加的,表单名称是用 _n ,例如。 provider_number_3
    • 删除按钮将删除全部行,这意味着 provider_number_1 提供商编号3 但没有 provider_number_2

    enter image description here

    表单输出

    提供商编号被转换为比 *_n .

    其他字段, id , first_name ,等易于更新,感谢 copyfrom() .

    Array
    (
        [id] => 1
        [first_name] => Jon
        [last_name] => Doctor
        [abn] => 12345678902
        [mobile] => 0491729472
        [email] => john.doctor@email.com
        [provider_numbers] => Array
            (
                [0] => Array
                    (
                        [provider_number] => ASBDF24
                        [practice_site_id] => 2
                    )
    
                [1] => Array
                    (
                        [provider_number] => 1249FBK
                        [practice_site_id] => 2
                    )
    
            )
    
    )
    

    问题

    提交表单时,可能会出现一些有关提供商编号的情况:

    • 添加了新的提供商编号
    • 提供商编号已更改
    • 更改了练习场地
    • 提供商编号已删除

    怎么做才是最好的方式?(最好使用无脂肪框架 DB\SQL\Mapper 类)。

    可能的解决方案:

    • $db->exec() 获取现有的 provider_number 表,其中 provider_id = POST.id
    • 执行 array_diff() DELETE 对这些记录的声明。截断原始数组。
    • 遍历数组,查看 s匹配。如果他们这样做了,但是 practice_site_id 不同,更新。如果 机构_现场_ id
    • 如何准确确定 提供商编号 因特定原因发生了变化 机构_现场_ id ?

    另一种可能性:

    • 将表单更改为包含 provider_number.id ,添加新行时,从数据库中获取最新的可用ID
    1 回复  |  直到 8 年前
        1
  •  0
  •   Jacob Mulquin    8 年前

    根据@xfra35在我问题中的建议,我选择了第二种可能性——添加 provider_number.id 到表单本身并从那里开始。如果您有任何进一步的建议或意见,请随时与我们分享!

    表单已修改,以便将值插入 provider_numbers[provider_number][] and provider_numbers[practice_site_id][] 而不是 practice_site_1, practice_site_2, etc 。这使得代码可以动态插入行 容易得多 *_n 不再需要跟踪。

    <div class="delete-array"> 放置在表单内,每当单击删除按钮时,都会插入以下内容: <input type="hidden" name="provider_numbers[delete][]" value="' + id + '" /> .

    新按钮获取下一个 AUTO_INCREMENT 值,如果一次添加多个提供者编号,则具有一些基本逻辑。( 警告:如果多个用户同时操作此功能,将中断 )

    var new_id;
    $('.btn-add-provider-number').click(function() {
    
        if (typeof(new_id) === "undefined") {
            $.getJSON({url:'{{ @BASE }}/provider_numbers/new_id.json', async:false}).done(function(data) {
                new_id = data;
            });
        } else {
            new_id++;
        }
    
        var newRow = ' .... ';
        $('.provider-numbers').append(newRow);
    }
    

    表单提交现在看起来类似于:

    Array
    (
        [id] => 1
        [first_name] => Amy
        [last_name] => Doctor
        [abn] => 66627819264
        [mobile] => 0472888798
        [email] => amy.doctor@email.com
        [provider_numbers] => Array
            (
                [delete] => Array
                    (
                        [0] => 6
                    )
    
                [provider_number] => Array
                    (
                        [0] => 64872HJF
                        [1] => 182947KD
                    )
    
                [practice_site_id] => Array
                    (
                        [0] => 1
                        [1] => 2
                    )
    
                [id] => Array
                    (
                        [0] => 1
                        [1] => 7
                    )
            )
    )
    

    然后使用以下代码进行处理:

    $updated = [];
    $provider_numbers = [];
    $provider_numbers_delete = [];
    
    foreach ($f3->get('POST') as $key => $val) {
        if ($key == 'provider_numbers') {
            foreach ($val as $pn_key => $pn_val) {
                if ($pn_key !== 'delete') {
                    foreach ($pn_val as $pnk_key => $pnk_val) {
                        $provider_numbers[$pnk_key][$pn_key] = $pnk_val;
                    }
                } else {
                    $provider_numbers_delete = $pn_val;
                }
            }
        } else if (is_scalar($val) && $practitioner->exists($key)) {
            $practitioner->set($key, $val);
            $updated[] = $key;
        }
    }
    
    if (!empty($provider_numbers)) {
        foreach($provider_numbers as $pn) {
            $provider_number->load(['id = ?', $pn['id']]);
            if ($provider_number->dry()) {
                $provider_number->set('practitioner_id', $f3->get('POST.id'));
            }
            $provider_number->copyfrom($pn);
            $provider_number->save();   
            $updated['provider_numbers'][] = $pn;
        }
    }
    
    if (!empty($provider_numbers_delete)) {
        foreach ($provider_numbers_delete as $pnd) {
            $provider_number->load(['id = ?', $pnd]);
            if (!$provider_number->dry()) {
                $provider_number->delete(); 
            }       
        }
    }