2017-01-31 67 views
1

我有一個提問和獲取答案的網站。當問一個問題時,我希望能夠用多個主題標記新問題。使用多重選擇,我已將一組topic_ids發送回控制器。我一直在關注Cake的文檔,但是我收到很多錯誤。在CakePHP中鏈接多對多關聯

這是鏈接關聯實體與多對多關係的正確方法嗎?如果需要的話,我可以提供更多信息或代碼。

$question = $this->Questions->newEntity(); 

if ($this->request->is('post')) { 
    $topics = array_map(
     function($id) { 
      $topic = $this->Questions->Topics->get($id); 
      $topic->_joinData = $this->Questions->TopicsQuestions->newEntity(); 
      // user_id is metadata in the topics_questions table 
      $topic->_joinData->user_id = $this->Auth->User()->id; 

      return $topic; 
     }, 
     // this is passed back as an array of topic_id 
     $this->request->data['topics']; 
    ); 

    $this->Questions->Topics->link($question, $topics); 

    $question = $this->Questions->patchEntity($question, $this->request->data, ['associated' => ['Topics']]); 

    if ($this->Questions->save($question)) { 
     return $this->redirect(['action' => 'view', $question->id]); 
    } else { 
     $this->Flash->error(__('The question could not be saved. Please, try again.')); 
    } 
} 
+0

歡迎來到Stack Overflow。每當接收到錯誤時,請將它們添加到您的問題中,包括完整的堆棧跟蹤(理想情況下,以可正常讀取的方式從日誌中複製),即使問題對熟悉CakePHP!的人員來說也是顯而易見的。提示:'BelongsToMany :: link()'方法的API文檔對於該方法的作用是什麼,以及它期望提供什麼樣的數據? – ndm

+0

謝謝。我對蛋糕很陌生。我知道如何使用調試工具包,但我不知道如何以可讀的形式獲取堆棧跟蹤,我可以將其複製並粘貼到此處。有了這段代碼,我得到了「500錯誤運行時異常」 「源實體和每個目標實體都假定已經持久」這是否意味着我需要在保存該問題後進行鏈接調用? – pjenk213

+0

工作!非常感謝您的幫助,並將我引導至解決方案,而不是將其交給我。對此,我真的非常感激。 – pjenk213

回答

0

從CakePHP的API文檔:

兩個源實體和每個目標實體被假定爲 的是已經持續存在,如果它們被標記爲新的或他們的狀態是 未知,則將會拋出異常。

因此,在問題保存後需要進行鏈接調用。

+0

由於這些主題已經存在於數據庫中,我認爲通過使用'_ids'方法可以使這更簡單。查看[轉換所有許多數據](https://book.cakephp.org/3.0/en/orm/saving-data.html#converting-belongstomany-data)。這不會讓你在連接表中的用戶ID,但你可以使用[Footprint plugin](https://github.com/UseMuffin/Footprint)來爲你自動處理。 –