繁体   English   中英

如何检查所有数据(如果没有错误),然后使用Laravel更新到数据库

[英]How can I check all data if not error then update into database with 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 ++)
    {
        $user = User::findOrfail($data[$i]['id']);
        $user->target = $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();
    }

如您所见,每个工作首先循环,它将先检查所有$ 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();

}
$user = User::findOrfail($data[$i]['id']);

如果找不到模型,则将抛出Illuminate\\Database\\Eloquent\\ModelNotFoundException ,因此不需要您的第一个循环。

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

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

参见这里: Laravel文档

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

我相信使用交易是必经之路。 到目前为止,所有其他答案都是正确的,但是它们确实会在错误发生之前保存用户。 在我看来,您想要确保所有数据都有效,甚至还没有保存一个用户。

您开始事务时,采用通常的保存用户的方式,如果发生错误,则抛出异常并回滚所有已保存的用户。

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();
}

您正在寻找的是验证。 您应先对所有用户提交的数据进行验证,然后再进行操作,以确保其格式符合您的预期且其中不包含任何无效值。

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

您可以在Laravel官方文档中阅读有关表单请求验证的更多信息: https ://laravel.com/docs/master/validation#form-request-validation

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM