2014-01-31 1 views
1

Я не могу обновить внешний ключ дочернего элемента в hasMany отношения в функции редактирования родителя. Я проверил данные, и я определенно передаю другой родительский идентификатор, но независимо от того, что я пытаюсь, он устанавливает родительский идентификатор как идентификатор родителя, который я редактирую.CakePHP: не удается обновить внешний ключ для hasMany дочерних элементов в родительском

Вот что данные $_POST дают мне:

{ 
     "Parent" => { 
      "id" => "4", 
      "name" => "Parent" 
     }, 
     "Child" => { 
      "1" => { 
        "parent_id" => "0", 
        "id" => "1" 
      } 
     } 
    } 

Когда я смотрю, на котором SQL запроса он работает, и я получаю это:

UPDATE `cakephp`.`children` SET `parent_id` = 4, `id` = 1, 
`modified` = '2014-01-31 15:37:27' WHERE `cakephp`.`children`.`id` = '1' 

Я использую функция saveAll(), но я готов попробовать другие методы. Есть ли способ обойти это? Я искал вокруг, но, похоже, не нашел исправления для моей проблемы.

Моя основная цель - удалить ассоциацию от родителя, но все равно сохранить данные обоим. Это позволит мне освободить ребенка, чтобы он был связан с другими моделями.

Пожалуйста, дайте мне знать, если мне не хватает каких-либо важных деталей!

ответ

0

Таким образом, вы должны изменить свою стратегию в настоящее время: использовать UpdateAll, как указано ниже:

$this->Parent->recursive = -1; // free from all association 
$this->Parent->updateAll(array('name'=>$myArray['Parent']['name']), 
       array('id'=>$myArray['Parent']['id'])); 
$lastId = $this->Parent->getLastInsertID(); 

Аналогично с моделью детского

$this->Child->recursive = -1; // free from all association   
$this->Child->updateAll(array('parent_id'=>$lastId), 
       array('id'=>$myArray['Child']['1']['id'])); 

если Дочерний индекс имеет более чем один массив внутри затем

$updateCondtion = Set::classicExtract($myArray, 'Child.{n}.id'); 
$this->Child->updateAll(array('parent_id'=>$lastId), 
       array('id'=>$updateCondtion)); 

    $myArray =  { 
     "Parent" => { 
      "id" => "4", 
      "name" => "Parent" 
     }, 
     "Child" => { 
      "1" => { 
        "parent_id" => "0", 
        "id" => "1" 
      } 
     } 
     } 

Другой подход в целом!

+0

Это устанавливает родительский идентификатор для чего-то другого, кроме исходного родительского идентификатора, однако теперь он создает новый пустой родительский элемент и вместо этого устанавливает идентификатор. Я пробовал использовать значения, такие как 0, -1 и null, все тот же результат. – TurboUser

+0

@TurboUser проверить отредактированный ответ! – Anubhav

+0

Рекурсивный = -1, похоже, не работает для ребенка, но это не большая проблема. Похоже, мне пришлось бы переопределить функцию updateAll() http://blog.pepa.info/php-html-css/cakephp/getting-rid-of-joins-in-updateall-query/ – TurboUser