为了账号安全,请及时绑定邮箱和手机立即绑定

如何将数组从 XMLHTTPREQUEST API POST 保存到 Laravel 控制器

如何将数组从 XMLHTTPREQUEST API POST 保存到 Laravel 控制器

蓝山帝景 2022-10-21 14:41:35
我想将我的数组保存在从 Javascript XMLHTTP 请求发送的数据库中。Javascriptfunction xml2() {    var xhttp = new XMLHttpRequest();    xhttp.onreadystatechange = function() {      if (this.readyState == 4 && this.status == 200) {        console.log(JSON.parse(this.responseText));        }    };    xhttp.open("POST", "http://localhost/sekai_adminlte3_rnd/api/rnd/postdata", true);    var singlevar = {"country_name":"Indonesia","country_code":"ID"}    xhttp.send(singlevar);      }laravel 中的控制器public function postdata(Request $request){        $country = Country::create([        'country_code' => $request->get('country_code'),        'country_name' => $request->get('country_name'),    ]);    return $country;}使用此代码,我无法保存到数据库。
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

来自文档: “您也可以使用该create()方法将新模型保存在一行中。”


您使用该create()方法的方式有点错误,因为:“一旦我们使属性可以批量分配,我们就可以使用 create 方法在数据库中插入一条新记录。”


因此,要么使用该$country->save();方法而不是return $country您在代码中使用的方法,要么使用更好的方法,使您的Country Model中的字段可填充(可批量分配),例如:


class Country extends Model

{

    /**

     * The attributes that are mass assignable.

     *

     * @var array

     */

    protected $fillable = ['country_code', 'country_name'];

}

然后在你的控制器中你可以使用:


public function postdata(Request $request)

{        

    $country = Country::create([


        'country_code' => $request->get('country_code'),

        'country_name' => $request->get('country_name'),


    ]);


    // return $country; // this one is not needed at all    

}

该create()方法返回保存的模型实例:


链接到文档: https ://laravel.com/docs/7.x/eloquent#mass-assignment


现在,再看一下您的代码,绝对不可能没有错误(在您的浏览器控制台中),因为我没有看到随您的请求发送的任何CSRF 令牌,而且该XMLHttpRequest.send()方法不会将您的数据传递给您的 Laravel控制器,因为数据必须采用特定格式。


因此,请确保您拥有 CSRF 令牌。最简单的方法是将其包含在您的html head喜欢中:


<head>

  <meta name="csrf-token" content="{{ csrf_token() }}">

</head>

然后令牌也必须包含在 Javascript 脚本中。您将在下面的脚本中找到它。


而且由于您要发送的数据看起来像一个关联的数据数组,因此它应该包含在FormData对象中(作为该send()方法的适当格式),这样您就不会遇到数据格式和获取数据的问题在您的控制器中。所以它会按原样工作。您的脚本应如下所示:


<script>


function xml2() {

    var xhttp = new XMLHttpRequest();

    let token = document.querySelector('meta[name="csrf-token"]').content;


    xhttp.open("POST", "/sekai_adminlte3_rnd/api/rnd/postdata", true);

    xhttp.setRequestHeader('X-CSRF-TOKEN', token);

    

    var singlevar = new FormData;

    singlevar.append('country_name', 'Indonesia');

    singlevar.append('country_code', 'ID');

    xhttp.send(singlevar);

}


</script>

我希望您可以通过上述改进使其工作。如果您的路由和网址都可以,它必须工作。


查看完整回答
反对 回复 2022-10-21
?
慕斯王

TA贡献1864条经验 获得超2个赞

像这样试试


try{

   $country = new Country();

   $country->country_code = $request->get('country_code'); 

   $country->country_name = $request->get('country_name');

   $country->save();

}

catch(\Exception $e){

   dd($e->getMessage());

}


查看完整回答
反对 回复 2022-10-21
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信