复杂的JSON与Cakephp 3

复杂的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

我正在从事一个项目,该项目涉及通过JSON将数据“概要文件”传递给web应用程序。我正在使用CakePHP3.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']);
    }
....
获取_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']
        ]
    );