复杂的JSON与Cakephp 3
我正在从事一个项目,该项目涉及通过JSON将数据“概要文件”传递给web应用程序。我正在使用CakePHP3.0,对它非常陌生。我将概要文件存储在mysql数据库中,可以轻松查询数据并将其转换为基本JSON格式,每一行在JSON中都是一个单独的值: Controller.php:复杂的JSON与Cakephp 3,php,mysql,json,cakephp,cakephp-3.0,Php,Mysql,Json,Cakephp,Cakephp 3.0,我正在从事一个项目,该项目涉及通过JSON将数据“概要文件”传递给web应用程序。我正在使用CakePHP3.0,对它非常陌生。我将概要文件存储在mysql数据库中,可以轻松查询数据并将其转换为基本JSON格式,每一行在JSON中都是一个单独的值: Controller.php: .... public function getProfileData() { $uid = $this->Auth->user('id'); $this->l
....
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']);
}
....
获取_profile_data.ctp:
<?= json_encode($profile); ?>
我希望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重新构造成这种结构似乎有意义吗
提前谢谢 多亏了用户ndm,我意识到我的方法有一些问题。我认为将所有数据放在一个表中可以简化事情,但实际上这会使事情更加复杂,需要冗余数据存储(例如,为每个概要文件条目存储一个纬度和经度值,而不是仅在单独的表中存储一次) ndm还提到 您只需在查找中正确地设置属性和关联的>表,如果关联的属性名称是>profile\u data,您甚至不必修改结果 在修改了表模型文件之后,我为一个新的“ProfileDataTable.php”文件准备了以下内容: 这是一个新的“AlertDataTable.php”文件: 这里的重点是“belongsTo”和“hasMany” 然后,我可以更改查询并使用“contain”轻松地将两个表链接在一起,并获得我想要的JSON格式:
$this->AlertData->find(
'all',
['conditions' =>
['AlertData.user_id =' => $uid],
'contain' =>
['ProfileData']
]
);
看起来您的数据库中有很多重复数据,即您的模式没有正常化!?这是真的-我打算先让它只使用一个表(看起来更容易),然后将数据拆分为两个表,其中一个表中有alert_id、alert_名称、initialized_time、alert_lat和alert_lon,还有alert_id、forecast_time、minimum_dbz_forecast、maximum_dbz_forecast、average_dbz_forecast,和另一个表中预测的置信度(两个“警报id”相互对应)。在后一种情况下,把这个JSON放在一起会更容易吗?很可能是的。您只需在查找中正确设置和关联的表,如果关联的属性名称为
profile\u data
,您甚至不必修改结果。感谢您为我指明了正确的方向!我让它工作了。我会写一份详尽的回复,对我为将来可能有这个问题的人所做的一切做出回应。
class ProfileDataTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('profile_data');
$this->setDisplayField('title');
$this->setPrimaryKey('alert_id');
$this->addBehavior('Timestamp');
$this->belongsTo('AlertData', [
'foreignKey' => 'alert_id'
]);
}
}
class AlertDataTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('alert_data');
$this->setDisplayField('title');
$this->setPrimaryKey('alert_id');
$this->addBehavior('Timestamp');
$this->hasMany('ProfileData', [
'foreignKey' => 'alert_id'
]);
}
}
$this->AlertData->find(
'all',
['conditions' =>
['AlertData.user_id =' => $uid],
'contain' =>
['ProfileData']
]
);