我一直在尝试以JSON格式存储车辆信息,以便更快地访问车辆图像。
我已经在数据库中为JSON建立了一个表。 JSON设置如下所示。所有车辆及其所有图像信息都在此JSON中。我不确定这是否是存储数据的最佳方法。我希望能够基于VIN快速搜索,以仅获取与该VIN相关的图像。
我的问题:
可能的解决方案(不限于一种):
我以前在InventoryPage上设置了循环,这是一个动态页面,它使用$ _GET获取关联的VIN,遍历我的数据库以获取与VIN关联的图像。这行得通,但是由于所需的迭代次数太长。
通常有比这更多的条目,为了便于阅读,我将其修剪回去。我们平均有100辆车,每辆车有20-60张图像。 这是我的JSON格式的示例:
[{"vin": "JF1GR89658L827860", "images": [{"image":
"https://cdn04.carsforsale.com/3/420970/23594569/1133776572.jpg?
dt=100320180034", "width": 800, "height": 600}, {"image":
"https://cdn04.carsforsale.com/3/420970/23594569/1133776606.jpg?
dt=100320180034", "width": 800, "height": 600}]},
{"vin": "6Y86G433753", "images": [{"image":
"https://cdn04.carsforsale.com/3/420970/23684711/1135715340.jpg?
dt=100620180134", "width": 800, "height": 600}, {"image":
"https://cdn04.carsforsale.com/3/420970/23684711/1135715371.jpg?
dt=100620180134", "width": 800, "height": 600}]}]
我目前必须遍历JSON并找到关联图像的代码,我认为这些图像错误地显示了来自不同车辆的图像:
foreach ($vehicles as $vehicle)
{
if ($vehicle['vin'] === $vin) {
$last_element = ',';
while ($vehicle['images']) {
echo "{";
echo "src: '" . $vehicle['images'][0]['image'] . "',";
echo "h: " . $vehicle['images'][0]['height'] . ",";
echo "w: " . $vehicle['images'][0]['width'];
echo "}" . $last_element;
}
break;
}
}
“代码循环”上方的预期输出(对于图像滑块):
{
src: "image_link",
h: vehicle_height,
w: vehicle_width
}
答案 0 :(得分:2)
请勿尝试手动创建JSON。用所有数据构造一个数组,然后调用json_encode()
。
$json_array = array();
foreach ($vehicles as $vehicle)
{
if ($vehicle['vin'] = $vin) {
foreach ($vehicle['images'] as $image) {
$json_array[] = ['src' => $image['image'], 'h' => $image['height'], 'w' => $image['width']];
}
break;
}
}
echo json_encode($json_array);
您还可以考虑使用vin
作为键,使JSON列成为对象而不是数组。这样就不需要循环,只需使用$vehicle[$vin]
。您还可以在MySQL查询中使用JSON_SEARCH()
来提取该元素而不是整个数组。
答案 1 :(得分:0)
这是一个自以为是的答案,但我真的看不到为此使用JSON列的好处。我认为您所拥有的数据看起来更适合传统的相关表。我认为JSON列非常适合存储更多非结构化数据,具有不同属性的不同对象集。但是您有一组相似的对象,每个对象都有一个完全相同的属性的平面列表。图像记录将完全适合它们自己的表,并且可能与具有其他与VIN相关的数据的不同表相关联,并且我认为以这种方式检索相关数据将更简单,更高效。只是我的两分钱,我知道它并不能真正直接回答问题,但是发表评论有很多。