首页 文章

Cakephp中对关联表的多个引用

提问于
浏览
0

在将两个表(许多天气雷达帧属于气象雷达站点)与belongsTo和hasMany相关联之后,我希望在同一个表(和不同的条件)上生成两个“包含”的JSON,这样我只能列出有具体情况 . 我现在拥有的东西不起作用;它只将第二个包含写入JSON .

雷达站点表:

...
public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('radar_site');

    $this->setDisplayField('radar_id');
    $this->setPrimaryKey('radar_id');

    $this->hasMany('FutureFrame', [
        'foreignKey' => 'radar_id'
    ]);

    $this->hasMany('RadarFrame', [
        'foreignKey' => 'radar_id'
    ]);
}
...

雷达框架表:

public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('radar_frame');

    $this->setDisplayField('radar_id');
    $this->setPrimaryKey('radar_id');

    $this->belongsTo('RadarSite', [
        'foreignKey' => 'radar_id'
    ]);
}

控制器:

public function getRadarData()
{
    $radarInfo = 
    $this->RadarSite->find(
        'all',
        [
            'contain' => [
                'RadarFrame' =>[
                    'sort' => ['RadarFrame.frame_time' => 'DESC'],
                    'conditions' => [
                        'RadarFrame.frame_time >' => time() - 60*60,
                        'RadarFrame.file_on_server =' => 1,
                        'RadarFrame.radar_type =' => 'velocity'
                    ]
                ],
                'RadarFrame' =>[
                    'sort' => ['RadarFrame.frame_time' => 'DESC'],
                    'conditions' => [
                        'RadarFrame.frame_time >' => time() - 60*60,
                        'RadarFrame.file_on_server =' => 1,
                        'RadarFrame.radar_type =' => 'reflectivity'
                    ]
                ]                   
            ]
        ]

    );    
    $this->set('radarInfo', $radarInfo);
}

JSON输出:

...,{
        "radar_id": "KHGX",
        "radar_name": "Houston\/Galveston, TX",
        "elevation": 18,
        "tower_height": 20,
        "max_latitude": 31.6485,
        "min_latitude": 27.2476,
        "max_longitude": -92.4946,
        "min_longitude": -97.6634,
        "latitude": 29.4719,
        "longitude": -95.0792,
        "radar_frame": [
            {
                "radar_id": "KHGX",
                "radar_type": "reflectivity",
                "frame_time": 1495473662,
                "is_analyzed": 1,
                "average_speed": null,
                "average_direction": null,
                "file_on_server": 1
            },
            {
                "radar_id": "KHGX",
                "radar_type": "reflectivity",
                "frame_time": 1495473305,
                "is_analyzed": 1,
                "average_speed": null,
                "average_direction": null,
                "file_on_server": 1
            },
            {
                "radar_id": "KHGX",
                "radar_type": "reflectivity",
                "frame_time": 1495473002,
                "is_analyzed": 1,
                "average_speed": null,
                "average_direction": null,
                "file_on_server": 1
            }
        ]
    },...

这样做的正确方法是什么?有没有一种简单的方法可以为控制器添加别名,以区分两个包含查询?我正在使用CakePHP 3.0 .

谢谢!!

1 回答

  • 0

    由于您的条件是静态的,您可以将它们放入关系中:

    雷达站点表:

    public function initialize(array $config)
    {
        parent::initialize($config);
    
        $this->setTable('radar_site');
    
        $this->setDisplayField('radar_id');
        $this->setPrimaryKey('radar_id');
    
        $this->hasMany('FutureFrame', [
            'foreignKey' => 'radar_id'
        ]);
    
        $this->hasMany('RadarFrameVelocity', [
           'className' => 'RadarFrame',
           'foreignKey' => 'radar_id',
           'conditions' => [
                'RadarFrame.frame_time >' => time() - 60*60,
                'RadarFrame.file_on_server =' => 1,
                'RadarFrame.radar_type =' => 'velocity'
            ]
        ]);
    
        $this->hasMany('RadarFrameReflectivity', [
            'className' => 'RadarFrame',
            'foreignKey' => 'radar_id',
            'conditions' => [
                'RadarFrame.frame_time >' => time() - 60*60,
                'RadarFrame.file_on_server =' => 1,
                'RadarFrame.radar_type =' => 'reflectivity'
            ]
        ]);
    }
    

    控制器:

    public function getRadarData()
    {
        $radarInfo = 
        $this->RadarSite->find(
            'all',
            [
                'contain' => [
                    'RadarFrameVelocity' =>[
                        'sort' => ['RadarFrameVelocity.frame_time' => 'DESC']
                    ],
                    'RadarFrameReflectivity' => [
                        'sort' => ['RadarFrameReflectivity.frame_time' => 'DESC']
                    ]                   
                ]
            ]
    
        );    
        $this->set('radarInfo', $radarInfo);
    }
    

    另见Associations - Linking Tables Together

相关问题