1

Advisor belongsTo Room、の関係を持つ2つのモデルがありRoom hasMany Advisorます。特定の部屋を指すAdvisorデータベース()にforeignKey制約があります。Advisor.room_idこれのデフォルト値はNULL値です(部屋のないアドバイザーを表します)。

に設定されたAdvisor、があったとします。ここで、部屋の割り当てを解除したいと思います。選択フィールドを使用して、次の構造でにリセットできます。room_idnnthAdvisorroom_idNULLrequest->data

[Room] => Array
    (
        [name] => TestRoom2
        [type] => single suite
        [id] => 4
    )

[Advisor] => Array
    (
        [0] => Array
            (
                [id] => 14
                [room_id] => 
                [name] => foo
            )
    )

ただし、同じ生成されたチェックボックスを使用してこれを実行しようとすると$this->request->data、MySQLは値の更新を拒否しNULLます。

room_idまた、2番目のケースで明示的にの値を変更しrequest->dataても効果がないようです。ただし、(直接変更して)に変更すると、Advisor.0.nameフィールドは保存されます。haxrequest->dataname

呼び出して保存し$this->Room->saveAll($request->data, array('deep' => true))ます。これは、選択フィールドとチェックボックスの両方の場合に当てはまります。

Formヘルパーを繰り返し呼び出すことにより、一連のチェックボックスを生成しています。

$count = 0;
// $key is the Advisor id, and $attributes is an array of the form
//      array('name' => (string), 'disabled' => (bool))
foreach($options['advisorList'] as $key => $attributes) {
    $form[] = $this->Form->hidden(sprintf('Advisor.%s.id', $count), array('value' => $key));
    $form[] = $this->Form->input(sprintf('Advisor.%s.room_id', $count), array(
        'type' => 'checkbox',
        'label' => $attributes['name'],
        'disabled' => $attributes['disabled']));
    $count++;
}

またroom_idすでにに設定されている場合は、チェックボックスがオンになっているかどうかに関係なく設定される場合を除いて、NULL問題なく設定できます。room_idroom_id

どんな助けでも大歓迎です-ありがとう!

4

1 に答える 1

0

解決しました!これは、hasMany関係のファンキーなcakePHP $ model-> saveAll()と関係があります。

このフォームを正しく更新するには、saveAll()で変更される可能性のあるすべてのアドバイザが、それぞれの部屋との関係を解除し、データベースに保存する必要があります。

foreach($copyOfData['Advisor'] as $advisor) {
    $advisor['room_id'] = null;
    $this->Advisor->save(array('Advisor' => $advisor));
}

これが行われた後にのみ、電話をかけ$this->Advisor->saveAll($this->request->data, array('deep' => true))saveAll()期待どおりに動作することができます。

于 2012-10-05T06:08:20.563 に答える