Php 如果没有错误,我如何检查所有数据,然后用Laravel更新到数据库中
嗨,我想检查所有数据,如果id没有任何错误,那么我想更新数据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 ++) {
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();
}