Php 如果没有错误,我如何检查所有数据,然后用Laravel更新到数据库中

Php 如果没有错误,我如何检查所有数据,然后用Laravel更新到数据库中,php,laravel,Php,Laravel,嗨,我想检查所有数据,如果id没有任何错误,那么我想更新数据 dd($data) output like this : 0 => array:3 [▼ "id" => "1" "target" => "100" ], 1 => array:3 [▼ "id" => "2" "target" => "200" ] for ($i = 0; $i < count($data); $i ++) {

嗨,我想检查所有数据,如果id没有任何错误,那么我想更新数据

dd($data) output like this :

0 => array:3 [▼
    "id" => "1"
    "target" => "100"
  ],
1 => array:3 [▼
    "id" => "2"
    "target" => "200"
]


    for ($i = 0; $i < count($data); $i ++)
    {
        $user = User::findOrfail($data[$i]['id']);
        $user->target = $data[$i]['target'];
        $user->save();
    }
dd($data)输出如下:
0=>数组:3[▼
“id”=>“1”
“目标”=>“100”
],
1=>数组:3[▼
“id”=>“2”
“目标”=>“200”
]
对于($i=0;$itarget=$data[$i]['target'];
$user->save();
}
我想做这样的事情

    for ($i = 0; $i < count($data); $i ++)
    {
        $user = User::findOrfail($data[$i]['id']);
        if(!user) {
            die('somethings error');
        }
    }

    for ($i = 0; $i < count($data); $i ++)
    {
        $user = User::findOrfail($data[$i]['id']);
        $user->target = $data[$i]['target'];
        $user->save();
    }
for($i=0;$itarget=$data[$i]['target'];
$user->save();
}
正如您所看到的,每个WorkFirst循环都将检查所有$user,然后再次循环更新user
但我认为在同一个变量上使用2 for循环是不好的。我怎样才能用漂亮的代码做这样的事情呢?你有没有试过把这两者结合起来:

for ($i = 0; $i < count($data); $i ++)
{
    // use just find as it returns null, findOrFail will throw an exception if the user is not found
    $user = User::find($data[$i]['id']);
    if(!user) {
        // you can use continue; which will skip the current iteration, and collect the errors.
        die('somethings error');
    }
    // this code will not execute if the user is not found
    $user->target = $data[$i]['target'];
    $user->save();

}
for($i=0;$itarget=$data[$i]['target'];
$user->save();
}
如果找不到模型,这将抛出
illumb\Database\Eloquent\ModelNotFoundException
,因此不需要第一个循环

因此,您可以只使用secound循环,而不会出现任何问题

如果未捕获异常,则会自动将404 HTTP响应发送回用户。使用这些方法时,无需编写显式检查以返回404响应

请看这里:


请记住,eiter
die
ModelNotFoundException
停止循环。因此,第一个骰子之后的每个数组元素都不会被更新。

我相信使用事务是一种方法。到目前为止,所有其他答案都是正确的,但它们确实在错误发生之前保存了用户。在我看来,在保存一个用户之前,您需要确保所有数据都是有效的

开始事务,按照通常的方式保存用户,如果发生错误,只需抛出异常并回滚所有保存的用户

DB::beginTransaction();
try{
  for ($i = 0; $i < count($data); $i ++)
    {
      $user = User::findOrfail($data[$i]['id']);
      if (!$user){
        throw new Exception();
      }
      $user->target = $data[$i]['target'];
      $user->save();
    }
  DB::commit();
} catch(Exception $e){
  DB::rollback();
}
DB::beginTransaction();
试一试{
对于($i=0;$itarget=$data[$i]['target'];
$user->save();
}
DB::commit();
}捕获(例外$e){
DB::rollback();
}

您需要的是验证。您应该在执行操作之前验证所有用户提交的数据,以检查其格式是否符合预期,并且不包含任何无效值

您可以在表单请求类中执行验证。这些是特殊的请求实例,您可以将其添加到控制器操作中,并将在操作之前运行。如果验证失败,则在运行控制器操作之前,会将用户重定向回错误消息

您可以在正式的Laravel文档中阅读有关表单请求验证的更多信息:

throw new Exception();意思是如果出现任何错误,请捕获并运行DB::rollback(),对吗?
DB::beginTransaction();
try{
  for ($i = 0; $i < count($data); $i ++)
    {
      $user = User::findOrfail($data[$i]['id']);
      if (!$user){
        throw new Exception();
      }
      $user->target = $data[$i]['target'];
      $user->save();
    }
  DB::commit();
} catch(Exception $e){
  DB::rollback();
}