我正在从数据库中收集一些数据,然后将其显示在索引 View 中。每行附近都有一个复选框,因此我可以让用户选择他们的最爱。
图文选自一张表cpv
。该表包含字段:id
、title
、image
。由于登录用户最多可以选择 3 个条目作为收藏夹,因此我有一个表来存储用户和他选择的 cpv.id 之间的关系。 user_cpv
表包含列:id
、user_id
、cpv_id
。
我做了一些显示数据+复选框的肮脏方式,我做了一些将信息 (cpv.id) 传递给应该保存 cpv.id 的 actionUpdate 的方法。但我不知道如何将所有这些保存到 user_cpv
表中。有人能给我一些关于如何正确执行此操作以及如何验证用户不能选择超过 3 个框的想法吗?这是我的代码:
索引 View :
<?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 打开表单:
我的 Action 更新:
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...
}
// ???
}
有没有人知道应该如何正确地做到这一点?
最佳答案
我看到两种方法:第一种是创建“batchUpdate”方法 - 但对于不同的数据库类型,它不会相同。所以我将描述第二个,因为它看起来很简单。
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();
关于php - 如何使用 Yii2 更新/插入值数组到数据库(一个 id 的多个值重复),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30712294/