如何使用Yii2更新/插入值数组到数据库(重复一个id的许多值)

时间:2015-06-08 14:46:25

标签: php mysql yii2

我从数据库中收集一些数据,然后在索引视图中显示它。我每行附近都有复选框,所以我可以让用户选择他们的收藏夹。

enter image description here

从一张表cpv中选择图片和文字。该表包含字段:idtitleimage。由于登录用户可以选择最多3个条目作为收藏夹,因此我有用于存储用户和他选择的cpv.id之间关系的表。 user_cpv表格包含以下列:iduser_idcpv_id

我做了一些显示数据+复选框的脏方法,我做了一些方法将信息(cpv.id)传递给应保存cpv.id的actionUpdate。但我无法弄清楚如何将所有这些保存到user_cpv表。有人可以给我一些关于如何正确执行此操作的想法以及如何进行验证,用户无法选择超过3个框?这是我的代码:

索引视图:

<?php foreach ($values as $data): ?>
    <tr>
        <td>Img goes here</td>
        <td>Title goes here</td>

        <?php // here I have some dirty code, for each row displayed I am executing query that should find entry in 
              // user_cpv table where cpv_id there is == with the cpv.id taken drom cpv table.
              // can this be done more efficient ?
         ?>

        <?php $cpv = UserCpv::getCpvByCpvId($data['cpvId']) ?>
        <?php if ($cpv): ?>
            <td><?= Html::checkbox('favorite[]', true, ['value' => $data['cpvId']]) ?></td>
        <?php else: ?>
            <td><?= Html::checkbox('favorite[]', false, ['value' => $data['cpvId']]) ?></td>
        <?php endif ?>

    </tr>
<?php endforeach ?>

使用Html :: form打开表单:

我的动作更新:

public function actionUpdate()
{
    $userId = Yii::$app->user->identity->id;

    // array of checked cpv.ids (['0' => someId, ['1' => otherCheckedId]])
    $favorites = Yii::$app->request->post('favorite');

    $model = UserCpv::findOne(['user_id' => $userId]);

    if ($model) 
    {
        // this does not work
        $update = UserCpv::updateAll(['cpv_id' => $favorites], "user_id = $userId");

        return $this->render('index', [
            'model' => $model
        ]);
    } 
    else 
    {
        # code...
    }
    // ???
}

有人知道如何正确地完成这项工作吗?

1 个答案:

答案 0 :(得分:3)

我看到两种方式:第一种方法是创建批量更新&#39;方法 - 但对于不同的数据库类型它将不相同。所以我将描述第二个,因为它看起来很简单。

1. Remove all user relations: 

    UserCpv::deleteAll(['user_id' => $userId]);

2. Create array for batchInsert method:

    $data = [];
    foreach($favorites as $cpv_id) {
        $data[] = ['cpv_id' => $cpv_id, 'user_id' => $userId];
    }

3. Batch insert your data

    Yii::$app->db->createCommand()->batchInsert(
        UserCpv::tableName(), 
        ['cpv_id', 'user_id'], 
        $data
    )->execute();