我从数据库中收集一些数据,然后在索引视图中显示它。我每行附近都有复选框,所以我可以让用户选择他们的收藏夹。
从一张表cpv
中选择图片和文字。该表包含字段:id
,title
,image
。由于登录用户可以选择最多3个条目作为收藏夹,因此我有用于存储用户和他选择的cpv.id之间关系的表。 user_cpv
表格包含以下列:id
,user_id
,cpv_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...
}
// ???
}
有人知道如何正确地完成这项工作吗?
答案 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();