1

拿起 knockout.js,我正在尝试使用 PHP(更具体地说是 Laravel 框架)将数据保存到 mysql 数据库中。这是阿贾克斯:

$.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()的是对象类型。Json_decode 引发错误,因为它需要一个字符串,现在我有点迷路了,因为我需要 JSON。

4

3 回答 3

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 。

于 2013-04-14T15:25:38.867 回答
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
于 2013-04-14T15:25:16.533 回答
-1

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

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

相反,这些字段是淘汰的 observables:

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

您实际上需要调用每个 observable 来获取它的当前值。显然,这可能很乏味,但有一个映射插件可以为您完成此任务——Knockout 映射插件

使用映射插件,您可以简单地执行以下操作:

ko.mapping.toJSON(viewmodel)

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

于 2013-04-14T14:53:36.260 回答