我在数组中有一个JSON数组:
{
layouts: [
{
w: 6,
h: 4,
x: 0,
y: 0,
i: "n0",
minW: 1.5,
minH: 1,
maxH: 1000,
moved: false,
static: false,
widget: "Clock"
},
{
w: 2,
h: 2,
x: 0,
y: 4,
i: "n1",
minW: 1,
minH: 1,
maxH: 1000,
moved: false,
static: false,
widget: "Weather"
}
]
}
我需要将每个小部件布局存储在数据库中。当我尝试执行查询时它返回值为空的错误。我尝试了here的一些例子,但它们对我不起作用。
功能:
public function store(Request $request)
{
$JSON = json_decode($request);
foreach (array($JSON) as $data) {
$i = 0;
$w = $data[$i]['w'];
$h = $data[$i]['h'];
$x = $data[$i]['x'];
$y = $data[$i]['y'];
$i = $data[$i]['i'];
$minW = $data[$i]['minW'];
$minH = $data[$i]['minH'];
$maxH = $data[$i]['maxH'];
$moved = $data[$i]['moved'];
$static = $data[$i]['static'];
$type = $data[$i]['type'];
DB::table('widgets')->insert(
['w' => $w,
'h' => $h,
'x' => $x,
'y' => $y,
'i' => $i,
'minW' => $minW,
'minH' => $minH,
'maxH' => $maxH,
'moved' => $moved,
'static' => $static,
'type_widget' => $type]
);
$i++;
}
return response()->json(201);
}
谁能告诉我循环数据保存它的正确方法是什么?
当你成功使用Sven Hakvoorts的答案时,这里是你的foreach的缩短版
$i = 0;
$data = json_decode($request, true);
while (isset($data['layouts'][$i])) {
DB::table('widgets')->insert($data['layouts'][$i]);
$i++;
}
甚至更短(和最好的方式):
foreach ($data['layouts'] as $row) {
DB::table('widgets')->insert($row);
}
我认为你只需重命名一列就可以使这个短代码工作:输入type_widget,这样你的字段和列名相同,这会导致代码更短,你可以看到。
您需要使用json_decode($array, true)
第二个参数(true
)表示需要将输入字符串转换为关联数组,从而正确解析您的JSON。
您还可以使用Request
直接从$request->all()
中提取JSON。我会推荐这种方法,因为这样更容易,并且数组将始终被正确解析。解码Request
对象可能会导致与最初提交的数组格式不同(除了数据之外还包含Request对象本身的数据)。
1.
$JSON = json_decode($request);
改为
$JSON = json_decode($request,true);
2.从foreach循环中删除$ i = 0并将其放在befor foreach循环中