选择了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的经验不足,但不应该是这个过程:
因此,在我第一次尝试不起作用时$data = Input::json()
属于object类型。 Json_decode抛出一个错误,因为它需要一个字符串,现在我有点丢失,因为我期待JSON。
答案 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对象。