将JSON数据保存到数据库

时间:2013-04-14 14:42:02

标签: javascript knockout.js laravel json

选择了knockout.js,我正在尝试使用PHP将数据保存到mysql数据库(Laravel框架更具体)。这是ajax:

$.ajax("save", {
  data: ko.toJSON(this), // turns the input into JSON I assume?
  type: "post",
  success: function() {
    alert("Success!");  // right now I'm alerting the data to troubleshoot
  }
});

我将数据保存到数据库中的方法:

// I expect my ajax to send me data that is in json format
// I then decode the data to get an array which I can use to run my query
$data = json_decode(Input::json(), true);
return DB::table('content')->insert($data);

然而,问题是我似乎正在接收对象类型的数据(在gettype()上运行$data并且json_decode()也返回了错误),stdClass Object确切地说。在对我的javascript中发生的事情进行故障排除后,我提醒了数据并且它是JSON,因此必须正常工作。

我确实让它工作,但是这样:

$data = json_encode(Input::json(), true);
return DB::table('content')->insert(json_decode($data), true);

这项工作成功,保存到数据库等但是我很困惑。请原谅我对JSON的经验不足,但不应该是这个过程:

  • 将数据编码到前端的JSON
  • 将数据发送到服务器
  • 解码后端数据,将其转换为可由服务器处理的格式(本例中为数组)
  • 插入数据

因此,在我第一次尝试不起作用时$data = Input::json()属于object类型。 Json_decode抛出一个错误,因为它需要一个字符串,现在我有点丢失,因为我期待JSON。

3 个答案:

答案 0 :(得分:4)

当您使用Input::json()时,Laravel会自动将JSON解码为一个对象供您使用。在大多数情况下,您可能希望使用提交的JSON进行一些工作,并且通常不会将其存储为JSON,而是存储在数据库行的单独列中。

如果您正在使用Laravel 3,则可以使用以下行来获取原始(未解码)JSON:

$raw = Request::foundation()->getContent();

在Laravel 4中,我相信它是:

$raw = Input::getContent();

或者,如果您希望将JSON解码为数组,则可以在Laravel 3中使用以下内容...

$array = Input::json(true);

Laravel 4中没有as-array等效。

答案 1 :(得分:0)

所以,我找到了解决方案。显然Input::json()返回对象类型的数据,PHP的通用对象,通常为空。所有数据都存储在该对象中,剩下要做的就是将该对象转换为数组。 get_object_vars()确实完成了结果将是一个格式良好的数组,这是有用的:

$data = get_object_vars(Input::json()); // will return an array, exactly what I need
return DB::table('tableName')->insert($data); // Data can be inserted now properly

答案 2 :(得分:-1)

如果您尝试将淘汰视图模型传输为json,则无法将视图模型直接转换为json。原因是视图模型中的所有字段实际上都不是这样的字段:

var viewmodel = {
    name: 'Bob',
    age: 23
};

相反,这些字段是淘汰可观察的:

var viewmodel = {
    name: ko.observable('Bob'),
    age: ko.observable(23)
};

您实际上需要调用每个observable来获取它的当前值。显然,这可能很乏味,但有一个映射插件可以为你做到这一点 - Knockout mapping plugin

使用映射插件,您只需执行以下操作:

ko.mapping.toJSON(viewmodel)

它将返回一个json字符串,表示viewmodel为常规js对象。