CakePHP 1.3 での HABTM の更新に問題があります。
まず、Alert モデルに表示される関係宣言を次に示します。
var $hasAndBelongsToMany = array(
'Region' => array(
'className' => 'Region',
'joinTable' => 'alerts_regions',
'foreignKey' => 'alert_id',
'associationForeignKey' => 'region_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
),
'ForecastZone' => array(
'className' => 'ForecastZone',
'joinTable' => 'alerts_forecast_zones',
'foreignKey' => 'alert_id',
'associationForeignKey' => 'forecast_zone_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
);
モデルのレコードを作成するためにフォームを送信すると、すべてが正常に機能し、関連するモデル (HABTM テーブル) で適切なレコードが作成されます。$this->data は次のようになります。
Array
(
[Alert] => Array
(
[title] => Test Alert
[overview] => This is a test alert overview
[user_id] => 3
[timeframe] => Tonight
[effective] => 2012-07-05 18:00:00
[effective_time] => 6:00
[effective_ampm] => pm
[expires] => 2012-07-05 21:00:00
[expires_time] => 9:00
[expires_ampm] => pm
)
[Region] => Array
(
[Region] => Array
(
[0] => 6
[1] => 5
)
)
[ForecastZone] => Array
(
[ForecastZone] => Array
(
[0] => 1598
[1] => 1594
[2] => 2685
[3] => 1565
[4] => 1613
[5] => 1595
)
)
)
さて、このモデル (Alert、ForecastZone、および Region) との複雑な関連付けのため、Alerts/Edit ページに予測ゾーンのみを更新するための別のインターフェイスがあるようにセットアップしました。Alerts コントローラーは、Forecast Zones が属するリージョンを特定し、コントローラーは [Region][Region] 値を独自に設定します。ForecastZones は、ユーザーがクリックして必要なゾーンを選択するインターフェイスから選択されます。
/alerts/edit アクションにフォームを送信すると、アラート データ (タイトル、概要など) を問題なく保存できます。ただし、関連する HABTM モデルを更新することは不可能です。私は $this->query() ですべてを実行する寸前ですが、最後にもう一度試して、何が問題なのかを突き止めます。
/alerts/edit に送信すると、フォームは次のようになります。
Array
(
[Alert] => Array
(
[id] => 37
[fcz_update] => true
)
[Region] => Array
(
[Region] => Array
(
[0] => 6
[1] => 5
)
)
[ForecastZone] => Array
(
[ForecastZone] => Array
(
[0] => 1595
[1] => 1613
[2] => 1565
[3] => 2685
[4] => 1594
[5] => 1598
[6] => 2989
[7] => 3723
[8] => 1650
[9] => 1626
[10] => 1653
[11] => 1678
[12] => 3447
[13] => 1649
[14] => 1654
[15] => 1675
[16] => 3448
[17] => 1668
[18] => 1664
[19] => 1635
[20] => 1667
[21] => 1628
)
)
)
$this->Alert->save($this->data) と $this->Alert->saveAll($this->data) を試しましたが、どちらも機能しません。どちらの save() 関数も 1 (true) を返すので、成功したと思いますが、最近編集したレコードに戻ると、何も変わっていません。他のすべてのアラート データを非表示フィールドとしてフォームに追加しようとしたので、アラート データ全体を一度に保存できましたが、これも機能しません。
編集:
これは、保存操作を実行する私の alerts_controller.php 編集関数/アクションのコードです。
if (!empty($this->data)) {
//If we are updating forecast zones
if(array_key_exists('fcz_update',$this->data['Alert'])){
$fcz_str = $this->data['Alert']['AlertForecastZone'];
$forecast_zones = explode(',',$fcz_str);
$fcz_regions = $this->ForecastZone->query('SELECT DISTINCT region_id FROM forecast_zones WHERE id IN (' . $fcz_str . ') AND region_id != 0;');
if(!empty($fcz_regions)){
foreach($fcz_regions as $fczr){ $alert_regions[] = $fczr['forecast_zones']['region_id']; }
$this->data['Region']['Region'] = $alert_regions;
}
$this->data['ForecastZone']['ForecastZone'] = $forecast_zones;
unset($this->data['Alert']['AlertForecastZone']);
//debug($this->data);
$this->Alert->save($this->data);
//Go back to alert edit to review changes
$this->redirect($this->referer());
}
}
最良のバグとは、エラーをスローしないか、何が問題なのかを理解する方法があるものです。とても怒っていてイライラしています...助けてください。