2017-01-31 9 views
1

質問と回答を得るためのウェブサイトがあります。質問をするときは、新しい質問に複数のトピックでタグを付けることができます。複数選択を使用して、コントローラにtopic_idsの配列を送り返しました。私はCakeのドキュメントに従ってきましたが、私は多くのエラーを受けています。CakePHPの多対多の関連団体へのリンク

関連するエンティティを多対多の関係にリンクする適切な方法ですか?必要な場合は、より多くの情報やコードを提供することができます。 CakePHPのAPIのドキュメントから

$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

スタックオーバーフローへようこそ。エラーを受け取ったときは、CakePHPに精通している人には明らかな問題であっても、完全なスタックトレース(ログから適切に読める形式でコピーするのが理想的です)を含めて、質問に追加してください。ヒント: 'BelongsToMany :: link()'メソッドのAPIドキュメントは、メソッドが何をしているのか、どのような種類のデータが供給されることを期待しているのですか? – ndm

+0

ありがとうございます。私はケーキにはかなり新しいです。私はデバッグキットの使い方を知っていますが、ここでコピーして貼り付けることができる読み取り可能な形式でスタックトレースを取得する方法がわかりません。このコードでは、 "500 Error RuntimeException"が発生します "ソースエンティティとターゲットエンティティの両方がすでに保持されているとみなされます"これは質問を保存した後にリンクを呼び出す必要があるということですか? – pjenk213

+0

これはうまくいった!あなたの助けを借りてくれてありがとう、私にそれを与える代わりに私を解決に導く。ほんとうにありがとう。 – pjenk213

答えて

0

:新規またはその状態が続い 不明であるとして、それらがマークされている場合

ソースエンティティとターゲットエンティティのそれぞれが に想定しているの両方が、すでに永続化例外がスローされます。

したがって、質問を保存した後にリンクを呼び出す必要がありました。

+0

トピックはすでにデータベースに存在しているので、 '_ids'メソッドを使用すると、これをさらに簡単にすることができます。 [BelongsToManyデータの変換](https://book.cakephp.org/3.0/en/orm/saving-data.html#converting-belongstomany-data)を参照してください。それはあなたに結合テーブルのユーザーIDを取得しませんが、[Footprint plugin](https://github.com/UseMuffin/Footprint)を使って自動的にそれを処理できます。 –

関連する問題