1

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());              

    } 

}

最良のバグとは、エラーをスローしないか、何が問題なのかを理解する方法があるものです。とても怒っていてイライラしています...助けてください。

4

2 に答える 2

0

関連データおよび関連データを保存するには、saveAll関数 を使用する必要があります$this->Alert->saveAll($this->data)

于 2016-10-18T16:02:28.237 に答える
0

データのキーイングで遊んでください。

[ForecastZone][0] => 1595 または [ForecastZone][0][id] => 1595 または [ForecastZone][0][ForecastZone] => 1595 を試してください

HABTM の正しいキーイング順序を覚えるのにいつも苦労しました。

于 2012-08-15T23:32:54.967 に答える