[英]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 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();
}
您正在寻找的是验证。 您应先对所有用户提交的数据进行验证,然后再进行操作,以确保其格式符合您的预期且其中不包含任何无效值。
您可以在表单请求类中执行验证。 这些是特殊的请求实例,您可以将其添加到控制器操作中,并将在操作之前运行。 如果验证失败,则在执行控制器操作之前,将使用错误消息将用户重定向回。
您可以在Laravel官方文档中阅读有关表单请求验证的更多信息: https ://laravel.com/docs/master/validation#form-request-validation
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.