2017-01-31 3 views
1

У меня есть сайт для вопросов и ответов. Когда задан вопрос, я хочу, чтобы можно было пометить новый вопрос несколькими темами. Используя multiselect, я отправил массив контроллеров 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

Добро пожаловать в переполнение стека. Всякий раз, когда вы получаете ошибки, добавьте их в свой вопрос, включая полный стек (идеально скопированный из журналов, где он доступен в удобной для чтения форме), даже если проблема может быть очевидна для людей, знакомых с CakePHP !. Подсказка: что говорят документы API из метода BelongsToMany :: link() 'о том, что делает этот метод, и какие данные он должен получать? – ndm

+0

Спасибо. Я довольно новичок в тортике. Я знаю, как использовать набор отладки, но я не уверен, как получить трассировку стека в читаемой форме, которую я могу скопировать и вставить сюда. С помощью этого кода я получаю «500 Error RuntimeException» «Предполагается, что и исходный объект, и каждый из целевых объектов уже сохранены» означает ли это, что мне нужно сделать вызов для ссылки после сохранения вопроса? – pjenk213

+0

ЭТО РАБОТАЕТ! Спасибо за тонну за вашу помощь и приведу меня к решению вместо того, чтобы дать мне это. Я очень ценю это. – pjenk213

ответ

0

Из API Docs CakePHP:

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

Таким образом, вызов ссылки необходимо было сделать после того, как вопрос был сохранен.

+0

Поскольку темы уже существуют в базе данных, я думаю, вы можете сделать это еще проще, используя метод '_ids'. См. [Преобразование BelongsToMany данных] (https://book.cakephp.org/3.0/en/orm/saving-data.html#converting-belongstomany-data). Это не даст вам идентификатор пользователя в таблице соединений, но вы можете использовать плагин [Footprint] (https://github.com/UseMuffin/Footprint), чтобы автоматически обрабатывать его. –

Смежные вопросы