【问题标题】:Creating a nested JSON object from SQL results从 SQL 结果创建嵌套 JSON 对象
【发布时间】:2014-05-15 16:07:12
【问题描述】:

我试图弄清楚如何创建一个嵌套的 JSON 对象,如下所示:

company: "Company 1",
pricing: {
    term: "1 year",
    price: "$4.95",

    term: "2 years",
    price: "3.95"
},

我在 MySQL 中有两个表,一个称为计划,它是以这种方式构造的

| id |  company  |
------------------
|  2 | company 1 |

还有一个表plans_pricing来表示定价数据

| id | plans_id |  term  | price | 
--------------------------------
| 1  |   2      | 1 year | $4.95 |
| 2  |   2      | 2 years| $3.95 |

我正在使用 Laravel 4 来查询数据库并创建 json 以发送回我的 ajax 请求。这是查询,当前正在发送服务器 500 错误。

public function results()
{
    $answers = $_POST['answers'];

    $data = DB::table('plans')
                ->join('plans_pricing', 'plans.id', '=', 'plans_pricing.plans_id')
                ->select('plans.company', 'plans_pricing.price', 'plans_pricing.term')
                ->whereIn('plans.id', $answers)
                ->get();

    echo json_encode($data);
}

我不确定为什么这个查询不起作用,但这甚至不是我问这个问题的原因。我需要知道如何获取嵌套的 JSON 对象,当我创建连接时,我相信我会为每个对象收到一个单独的对象,如下所示:

 |     company     |  price  |  term  |
  ------------------------------------
 |    company 1    |  4.95   | 1 year | 
 |    company 1    |  3.95   | 2 years|

如何让这个 SQL 查询返回一个嵌套的 JSON 对象,就像我上面描述的那样?我已经在这个问题上停留了两天,真的可以使用一些指导。谢谢

更新:

通过将 echo json_encode 更改为 return Response::json($data); 修复了服务器 500 错误

【问题讨论】:

  • $answers 的价值是多少?
  • 通常是一个 id 数组,例如 2, 3 , 4。但为了简单起见,假设 $answers = 2idcompany1
  • 您是否验证过您的查询是否正确执行,例如检查是否出错,或者$data 实际上包含行
  • 我没有收到任何错误,除了当我 console.log ajax 请求时出现服务器 500 错误。在我添加连接之前,查询运行良好
  • 如果你使用 laravel 而不是 echo json_encode 使用 return Response::json($data);另外,如果您在 chrome open 中,您的开发人员工具会在您发出请求时转到网络并选择 ajax 请求,它会给出什么错误?

标签: javascript php mysql sql json


【解决方案1】:

我从未使用过 Laravel,但我认为这 应该 工作:

$output = array();
$currentCompany = "";

foreach ($data as $datum) {
  if ($datum->company != $currentCompany) {
    $output[] = array();

    // get a reference to the newly added array element
    end($output);
    $currentItem = & $output[key($output)];

    $currentCompany = $datum->company;
    $currentItem['company'] = $currentCompany;
    $currentItem['rates'] = array();
  }
  $currentItem['rates'][] = array("price" => $datum->price, "term" => $datum->term);
}

json_encoded 结果:

[{
    "company":"company 1",
    "rates":[{
      "price":4.95,"term":"1 year"
    },{
      "price":3.95,"term":"2 years"
    }]
}]

【讨论】:

  • 我认为我认为自己在 PHP 方面相当流利,但我对您解决方案的某些部分感到困惑。为什么要在foreach 循环内部和外部声明$output[] = array();?你为什么使用end($output) 而我最困惑的那一行是$currentItem = & $output[key($output)]; 这行在做什么?再次感谢您的回答,效果很好,我只是对它的工作原理感到困惑
  • 我将整个变量 $output 声明为一个数组(第 1 行)。在循环内部,如果公司是新公司,我在 $output 中创建一个新元素并将其设置为空数组。然后我创建对新数组元素的引用——这就是以“获取对新添加的数组元素的引用”为前缀的两行所做的。还有其他方法可以在不使用参考的情况下达到相同的结果。
  • 很有趣,感谢您的解释。我真的很感激
  • @James 这个条件语句:if ($datum->company != $currentCompany) 是否意味着相同的 $datum->company 值不会在其他值之后再次出现?
  • @JeaffreyGilbert 正确。想法是为每个公司创建一个数组元素,并将其他 $data 值添加到现有元素(对于任何给定公司)。为此,输入列表 ($data) 必须按公司排序,以便同一公司的所有记录放在一起。
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2017-02-14
  • 2018-12-29
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多