Laravel 使用复选框更新多行

Laravel update multiple rows using checkboxes

我需要了解如何使用 laravel eloquent 方法根据已选中的复选框更新数据库中的多行。我现在正在使用以下代码,它在一定程度上起作用:

public function save()
{
    $post_data = Input::get('checkbox');

        if(is_array($post_data))
        {
            foreach ($post_data as $checkbox)
            {
                    $product        = Products::find($is_checked);

                if(!empty($checkbox))
                {
                    $product->is_checked    = '1';
                }
                else {
                    $product->is_checked    = '0';
                }
                    $product->save();
            }
        }

    Session::flash('success', 'Success message here');
    return Redirect::to('overview');
}

它确实保存了 "is_checked" 值,当复选框被 selected 时。在数据库中,它将值设置为“1”。但是如果我取消选中一个复选框,它不会更新该行并且 "is_checked" 保持在“1”。

但这不是我主要关心的问题。我想做的是不为此使用 foreach,因为我每次都需要更新多行,通常我需要更新 100 多行,所以 运行 100 个单独的查询不是可行的方法。

第一个问题: 如何使用 laravel eloquent 模型通过选中或取消选中复选框来更新 mysql table 中的多行?

第二个问题 如何根据 selected 的复选框和随附的下拉列表更新具有不同值的其他字段?示例如下:

<form name="bla">

<input type="checkbox" name="checkbox[]" value="{{ $id from database }}>
<select name="number">
<option value="1">1</option>
<option value="2">2</option>
And so on..
</select>

</form>

我有多个复选框,后面有一个 select 菜单。我希望完成的是:

[x] ID 为 1 的复选框 - Select 菜单选项 selected = 1

[x] ID 为 2 的复选框 - Select 菜单选项 selected = 5

[x] ID 为 3 的复选框 - Select 菜单选项 selected = 10

当我 select 三个复选框时,所有 3 个对应的行都应该在数据库中更新。所以在上面的例子中,应该会发生以下情况:

ID 为 1 的数据库行应为 "is_checked" 获取“1”值,并且 "number" 字段应为“1” id 为 2 的数据库行应为 "is_checked" 获取“1”值,"number" 字段应为“5” ID 为 3 的数据库行应为 "is_checked" 获取“1”值,并且 "number" 字段应为“10”

我希望这个解释能清楚地说明我想要完成的事情,我希望它不会以任何方式造成混淆。

因此,取消选中复选框和不更新记录的问题在于,如果取消选中复选框,则它不会作为值提交。

获取未选中的数据的一种方法是将原始数据集与提交的复选框进行比较,将它们与存储的值进行比较,如果不同则更新它们

要立即处理更新批次,您需要 select 并通过提前准备查询然后更新来立即更新。

当您选中和取消选中时,这可能仍需要两次查询。

遍历所有 ID,为选中和未选中的 ID 创建结果集

findMany 方法适用于 select 一堆

然后您可以用一行完成整个过程..

Products::findMany($checkedIDs)->update(['is_checked' => 1]);

Products::findMany($unCheckedIDs)->update(['is_checked' => 0]);

如果您尝试更新不同记录上的不同值,您仍然需要进行单独的查询,我相信 SQL 不支持 UPDATE X = Y WHERE ID = 1 AND UPDATE X = Z其中 ID = 2...

它始终是 DO UPDATE values TABLE WHERE clause,在任何变化 valuesclause 的情况下,您都需要分开。