在 Laravel 'update' 函数上,如何解析 JSON 对象,并用 ForEach 循环存储它

On a Laravel 'update' function, how to parse a JSON object, and store it with a ForEach loop

我正在使用 Laravel 框架来处理我的 MySQL 数据库,目前想从一个 JSON 对象更新我的数据库,该对象将从其他地方发送。

目前,我拥有与我的'Store'功能相同的功能,这显然是行不通的,因为它会更新所有内容,或者因为缺少信息而拒绝工作。

这是我目前拥有的 for each,它不起作用,但我不知道如何最好地用 for-each 解析 JSON,然后存储它。

 public function update(Request $request,$student)
    {
        $storeData = User::find($student);
        
       foreach ($request as $value) {
            $storeData-> username = $value;
       }

这是我的商店功能,包含前端团队可能以 JSON 格式发送的所有信息。

$storeData->username=$request->input('username');
        $storeData->password=$request->input('password');
        $storeData->email=$request->input('email');
        $storeData->location=$request->input('location');
        $storeData->role=DB::table('users')->where('user_id', $student)->value('role');
        $storeData->devotional_id=$request->input('devotional_id');
        $storeData->gift_id=$request->input('gift_id');

       $storeData->save(); 
        return dd("Info Recieved");

您可以将 JSON 对象转换为数组,然后在新数组上执行 foreach 循环。要更新 Laravel 中的 table,它是更新 ($storeData->update();) 而不是保存。保存就是插入。

$Arr = json_decode($request, true);

您可以像下面的代码片段一样编写方法。

此外,假设您正在使用 laravel API,因此您不需要解析传入的 JSON 输入,但您将在请求对象。

但是,您应该使用 filled 方法来确定该字段是否存在并具有值,否则更新函数将覆盖空值。

我刚刚将这个方法添加到第一个输入,但如果您不确定前端将传递什么,则必须在每个输入中使用它。

public function update(Request $request, $student)
{
    $storeData = User::find($student); // should be id

    if ($request->filled('username')) { // use this for other items also
        $storeData->username      =  $request->input('username');
    }
    $storeData->password      =  $request->input('password');
    $storeData->email         =  $request->input('email');
    $storeData->location      =  $request->input('location');
    $storeData->role          =  DB::table('users')->where('user_id', $student)->value('role');
    $storeData->devotional_id =  $request->input('devotional_id');
    $storeData->gift_id       =  $request->input('gift_id');

    $storeData->update(); 
    dd("Info Recieved");
}

为什么他们会在 post 中从前端发送 json 数据?

真的,它会来自表单输入。就像 Rinto 所说的那样,它将是请求对象。

$user->username = $request->user_name;

我收集到这是用于创建新用户的前面的表单。为什么不使用在寄存器区域为您设置的内置身份验证脚手架?

所以我个人会使用...

//look up user that matches the email or create a new user
$user = User::firstOrNew(['email' =>  request('email')]);

//add other input values here 
$user->name = request('name');

//save  
$user->save();

当问题在您正在做的事情中有点含糊时,很难给出确切的答案。 Laravel中有很多方法可以完成事情。从您的代码来看,它看起来像是注册。此外,我在您的代码中看到的一个大陷阱是您传递的是纯文本密码,然后将该密码以纯文本形式添加到您的数据库中。这是一个很大的安全漏洞。