为什么我的表单只将输入数据从foreach循环中的最后一个字段传递到数据库?

时间:2017-05-01 18:45:02

标签: php mysql html5 laravel

我正在尝试使用此foreach循环从表单更新数据库中的某些数据:

$players_ids = $_POST['player_ids'];

    foreach($players_ids as $player_id) {

        foreach($_POST['goals'] as $goals) {

            var_dump($goals);
            $updateGoals = \DB::table('stats')->where('id', $player_id)->update(['goals' => $goals]);
        }

        foreach($_POST['assists'] as $assists) {

            var_dump($assists);
            $updateAssists = \DB::table('stats')->where('id', $player_id)->update(['assists' => $assists]);
        }

        foreach($_POST['tackles'] as $tackles) {

            var_dump($tackles);
            $updateTackles = \DB::table('stats')->where('id', $player_id)->update(['tackles' => $tackles]);
        }

    }

以下是表格:

@foreach($players as $player)    

<tr>
    <input type="hidden" name="player_ids[]" value="{{ $player->id }}">
    <input type="hidden" name="game_id" value="{{ $game->id }}">
    <td>{{ $player->fn }} {{ $player->ln }}</td>
    <td><input type="number" value="0" name="goals[]" placeholder="goals"></td>
    <td><input type="number" value="0" name="assists[]" placeholder="assists"></td>
    <td><input type="number" value="0" name="tackles[]" placeholder="tackles"></td>
</tr>

@endforeach

当我尝试提交此数据时,它不会将每个玩家的各个统计数据传递到数据库,而只会将foreach循环中最后一个玩家的数据传递给每个玩家。因此,如果最终玩家有3个目标,那么每个人都将在数据库中获得3个目标。这显然不是我希望这个功能。

我知道不久之后我会遇到更新数据库中数据的问题,因为我不打算覆盖数据库中已有的数据,而是添加传递给值的值在数据库中,所以如果有人对此有任何了解,将不胜感激。

2 个答案:

答案 0 :(得分:3)

您的表单包含多个相同名称的元素副本。因此,它只使用具有该名称的最后一个元素。

要使用一系列值,您需要像[]一样使用player_ids

答案 1 :(得分:1)

发生这种情况的原因是你正在用目标,助攻和铲球的最后一个值更新每个球员。 (实际上,您正在为每个玩家更新目标,助攻和铲球,导致许多查询。)您可能需要更改输入,以便准确了解更新每个玩家的内容。

这也会减少循环次数并减少查询次数。

@foreach($players as $player)    
    <tr>
        <input type="hidden" name="player_ids[]" value="{{ $player->id }}">
        <input type="hidden" name="game_id" value="{{ $game->id }}">
        <td>{{ $player->fn }} {{ $player->ln }}</td>
        <td><input type="number" value="0" name="goals[{{ $player->id }}]" placeholder="goals"></td>
        <td><input type="number" value="0" name="assists[{{ $player->id }}]" placeholder="assists"></td>
        <td><input type="number" value="0" name="tackles[{{ $player->id }}]" placeholder="tackles"></td>
    </tr>
@endforeach


$players_ids = $_POST['player_ids'];
foreach ($players_ids as $player_id) {
    $updates = \DB::table('stats')->where('id', $player_id)->update([
        'goals' => $_POST['goals'][$player_id],
        'assists' => $_POST['assists'][$player_id],
        'tackles' => $_POST['tackles'][$player_id]
    ]);
}

这是未经测试的,但是如果您希望它在您的数据库中添加并且不会覆盖过去的值,那么您可以执行以下操作...

$players_ids = $_POST['player_ids'];
foreach($players_ids as $player_id) {
    $updates = \DB::table('stats')->where('id', $player_id)->update([
        'goals' => $_POST['goals'][$player_id] . '+' . DB::raw('goals'),
        'assists' => $_POST['assists'][$player_id] . '+' . DB::raw('assists'),
        'tackles' => $_POST['tackles'][$player_id] . '+' . DB::raw('tackles')
    ]);
}

一般来说,更好的方法是不要让它们成为加法,然后你只需用sum()来计算出每个玩家有多少目标,铲球和助攻。然后你就可以按照日期,游戏目标等目标进行额外的过滤......