Связь CakePHP HABTM, установка связанных записей всегда добавляет новую запись в jointable, даже если она уже существует - PullRequest
0 голосов
/ 17 марта 2011

Это мой код:

        $charities = explode(',',$this->data['Charity']['charities']);
        foreach ($charities as $key=>$charity){
            $data['Charity'][$key] = $charity;
        }
        $this->Grouping->id = $this->data['Charity']['grouping_id'];
        if ($this->Grouping->save($data)){
            //Great!
        }else{
            //Oh dear
        }

Код взят из действия, которое вызывается AJAX. $ this-> data ['Charity'] ['charities'] - список идентификаторов, разделенных запятыми, для модели Charity, которую HABTM Grouping.

Код работает нормально, за исключением того, что Cake, похоже, не проверяет, связана ли эта благотворительность с этой группировкой, поэтому я получаю множество повторяющихся записей в таблице соединений. Я вижу, что это будет боль позже, поэтому я хотел бы получить это прямо сейчас.

Что я делаю не так?

Спасибо

1 Ответ

0 голосов
/ 18 марта 2011

Несколько вещей, которые я заметил:

A. Является ли $this->data['Charity']['charities'] массивом с именованными ключами, соответствующими столбцам таблицы? Потому что внутри цикла foreach () вы берете ключ и помещаете его в массив $data['Charity']. Результатом может быть неправильный формат. Массив $ data для сохранения модели обычно форматируется как $data['Charity']['NAME_OF_COLUMN1], $data['Charity']['NAME_OF_COLUM2] и т. Д. Для каждого столбца, который требуется сохранить. Итак, если ключи являются числами, то у вас может быть что-то вроде: $data['Charity'][0], $data['Charity'][1], что неправильно.

B. Ассоциации HABTM сохраняются по-разному. Я рекомендую вам взглянуть на раздел книги по сохранению HABTM . Я сохраняю отношение HABTM следующим образом (предполагая отношение между пользователями и купонами):

$this->data['Coupon'] = array('id' => 1, 'code' = 'BlaBla');<br> $this->data['User'] = array('id' => 33);<br> $this->Coupon->save($this->data, false);

Итак, как вы можете видеть, массив $ data имеет подмассив, названный в честь внешней модели ('User') со столбцами + значениями, которые я хочу сохранить. Затем я сохраняю этот массив в модели Coupon.

C. Имейте в виду, что CakePHP всегда удаляет старые записи и вставляет новые в таблицу соединений , когда он «обновляет» отношения HABTM. Чтобы избежать этого, вы устанавливаете для поля «unique» значение false в конфигурации $ HABTM модели.

...