代码之家  ›  专栏  ›  技术社区  ›  Enthu

Yii2-通过检测数据更改动态插入/更新数据库值

  •  0
  • Enthu  · 技术社区  · 6 年前

    我想根据用户输入检测数据库中的更改。实际上,我应该通过id检测数据库中的新值或现有值。

    基本上,我希望动态检测最新用户输入的更新,并消除未被触及的更新。

    例子:

    • 技能集-A、B、C(因为是新的,所以插入)
    • 更新时,技能集(B、C、D)
    • 我将删除A并插入D,而不是更新B和C

    我的数据库存储了每种技能的每行数据。

    例子:

    • 用户A-技能A
    • 用户A-技能B
    • 用户A-技能C
    • 用户B-技能A
    • 用户B-技能B

    表格:

    $skills = (new \yii\db\Query())
    ->select(['id', 'name'])
    ->from('skillset')
    ->all();
    
    foreach ($skills as $skill) {
    echo "<br/><input type='checkbox' name=\"skill[]\" value='$skill[id]' /> $skill[name]<br>";
        }
    }
    
    ?>
    
    <br/>
    <div class="form-group" style="float:right">
        <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
    </div>
    

    控制器:

    $skills = Yii::$app->request->post('skill');
    
    $model = $this->findModel($id);
    
    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        foreach ($skills as $skill) { 
            Yii::$app->db->createCommand()
            ->insert('skillsetassignment', [
            'staff_id' => $id,
            'skillset_id' => $skill,
            ])->execute();
        }
    }
    

    Yii2中是否有处理此类情况的内置方法?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Gabriel Alejandro López López    6 年前

    您可以删除所有for user并再次插入新行。

    另一种更优雅的方式是使用集合操作和 array_diff() .下面是一个个人项目的例子:

    $removed_workers_ids = array_diff($initial_workers, $new_workers);
    $included_workers_ids = array_diff($new_workers, $initial_workers);
    
    • $initial_workers 是一个数组,其中包含请求开始时存在的工作人员的ID,即旧工作人员的ID。
    • $new_workers 是一个数组,其中包含根据请求选择的工作人员的ID
    • 数组_diff() 创造奇迹
    • 删除包含ID的所有行 $removed_workers_ids
    • 把那些放进去 $included_workers_ids

    还可以查看以下内容: https://www.yiiframework.com/doc/api/2.0/yii-db-command#upsert()-detail