【发布时间】:2017-03-31 15:33:23
【问题描述】:
我正在开展一个项目,该项目涉及通过 JSON 将数据“配置文件”传递到 Web 应用程序。我正在使用 Cakephp 3.0 并且对它很陌生。我将配置文件存储在 mysql 数据库中,并且可以轻松地查询数据并将其放入基本的 JSON 格式,每一行都是 JSON 中的单独值:
Controller.php:
....
public function getProfileData()
{
$uid = $this->Auth->user('id');
$this->loadComponent('RequestHandler');
$this->set('profile', $this->MapDisplay->find(
'all',
['conditions' =>
['MapDisplay.user_id =' => $uid]
]
)
);
$this->set('_serialize', ['profile']);
}
....
get_profile_data.ctp:
<?= json_encode($profile); ?>
返回如下内容:
{
"profile": [
{
"alert_id": 1,
"alert_name": "Test",
"user_id": 85,
"initialized_time": "2017-03-24T00:00:00",
"forecasted_time": "2017-03-24T00:10:00",
"minimum_dbz_forecast": 0,
"maximum_dbz_forecast": 10,
"average_dbz_forecast": 5,
"confidence_in_forecast": 0.99,
"alert_lat": 44.3876,
"alert_lon": -68.2039
},
{
"alert_id": 1,
"alert_name": "Test",
"user_id": 85,
"initialized_time": "2017-03-24T00:00:00",
"forecasted_time": "2017-03-24T00:20:00",
"minimum_dbz_forecast": 5,
"maximum_dbz_forecast": 15,
"average_dbz_forecast": 10,
"confidence_in_forecast": 0.99,
"alert_lat": 44.3876,
"alert_lon": -68.2039
},
{
"alert_id": 2,
"alert_name": "Test2",
"user_id": 85,
"initialized_time": "2017-03-24T00:00:00",
"forecasted_time": "2017-03-24T00:10:00",
"minimum_dbz_forecast": 10,
"maximum_dbz_forecast": 20,
"average_dbz_forecast": 15,
"confidence_in_forecast": 0.99,
"alert_lat": 44.5876,
"alert_lon": -68.1039
},
{
"alert_id": 2,
"alert_name": "Test2",
"user_id": 85,
"initialized_time": "2017-03-24T00:00:00",
"forecasted_time": "2017-03-24T00:20:00",
"minimum_dbz_forecast": 15,
"maximum_dbz_forecast": 25,
"average_dbz_forecast": 35,
"confidence_in_forecast": 0.99,
"alert_lat": 44.5876,
"alert_lon": -68.1039
]
}
我希望 A) 轻松调用单个配置文件,而不是搜索唯一的配置文件 ID,并且 B) 只需加载一个 JSON 文件即可获取所有配置文件内容。这样的输出会更理想:
{
"profile": [
{
"alert_id": 1,
"alert_name": "Test",
"initialized_time":"2017-03-24T00:00:00",
"alert_lat": 44.3876,
"alert_lon": -68.2039,
"profile_data": [
{
"forecasted_time": "2017-03-24T00:10:00",
"minimum_dbz_forecast": 0,
"maximum_dbz_forecast": 10,
"average_dbz_forecast": 5,
"confidence_in_forecast": 0.99
},
{
"forecasted_time": "2017-03-24T00:20:00",
"minimum_dbz_forecast": 5,
"maximum_dbz_forecast": 15,
"average_dbz_forecast": 10,
"confidence_in_forecast": 0.99
}
]
},
{
"alert_id": 2,
"alert_name": "Test2",
"initialized_time": "2017-03-24T00:00:00",
"alert_lat": 44.5876,
"alert_lon": -68.1039,
"profile_data": [
{
"forecasted_time": "2017-03-24T00:10:00",
"minimum_dbz_forecast": 10,
"maximum_dbz_forecast": 20,
"average_dbz_forecast": 15,
"confidence_in_forecast": 0.99
},
{
"forecasted_time": "2017-03-24T00:20:00",
"minimum_dbz_forecast": 15,
"maximum_dbz_forecast": 25,
"average_dbz_forecast": 35,
"confidence_in_forecast": 0.99
}
]
}
]
}
我将如何查询我的数据库并填充这个 JSON 结构?是否有任何 Cakephp 工具可以帮助做到这一点?将 JSON 重构为这种结构似乎有意义吗?
提前致谢!
【问题讨论】:
-
看起来您的数据库中有很多重复数据,即您的架构没有达到应有的规范化程度!?
-
这是真的 - 我打算先让它只处理一个表(看起来会更容易),然后将数据拆分为两个表,分别是 alert_id、alert_name、initialized_time、一个表中的 alert_lat 和 alert_lon 和另一个表中的 alert_id、forecasted_time、minimum_dbz_forecast、maximum_dbz_forecast、average_dbz_forecast 和 confidence_in_forecast(两个“alert_id”相互对应)。在后一种情况下将这个 JSON 放在一起会更容易吗?
-
很可能,是的。您只需正确设置associations,并在您的查找中设置contain 关联表,如果关联的属性名称为
profile_data,您甚至不必修改结果完全没有。 -
感谢您指点我正确的方式!我让它工作了。对于我为将来可能遇到此问题的人所做的事情,我会写一篇详尽的回复。
标签: php mysql json cakephp cakephp-3.0