2012-01-14 2 views
1

Я много искал, но ничего похожего на то, что я ищу.Как связать несколько записей одновременно с помощью cakephp hasMany?

То, что я пытаюсь сделать, - это связать одну запись «Пользователь» с другими несколькими записями «Карты» сразу с помощью несколько списков HTML.

Таблицы: пользователей (номер, имя, имя пользователя) карты (номер, user_id)

Модели:

class User extends AppModel { 
    public $name = 'User'; 
    public $hasMany = array('Card');} 

class Card extends AppModel {  
    public $name = 'Card'; 
    public $belongsTo = array('User');} 

вид edit.ctp Пользователь

echo $this->Form->input('id'); 
echo $this->Form->input('Card', array('multiple'=>true)); 

Как мой контроллер будет выглядеть? В настоящее время это выглядит так, но не спасает ничего, кроме записи пользователя «без соответствующих карт»

if (!empty($this->data)) { 
    foreach($this->data['User']['Card'] as $key => $item){ 
     $this->data['User']['Card'][$key] = array('id'=>$item, 'user_id'=>$this->data['User']['id']); 
         } 
     if ($this->User->saveAll($this->data)) { 
      //$this->User->Card->saveAll($this->data); 
      $this->Session->setFlash(__('The user has been saved', true)); 
      $this->redirect(array('action' => 'index')); 
     } else { 
      $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); 
    } 
} 
if (empty($this->data)) { 
    $this->data = $this->User->read(null, $id); 
    $this->set('cards', $this->User->Card->find('list')); 
} 

$ this-> Данные содержит:

Array 
(
    [User] => Array 
    (
     [id] => 1 
     [name] => Superman 
     [status] => 1 
     [Card] => Array 
     (
      [0] => Array 
      (
       [id] => 11402130001 
       [user_id] => 1 
      ) 
      [1] => Array 
      (
       [id] => 11402130002 
       [user_id] => 1 
      ) 
      [2] => Array 
      (
       [id] => 11402130003 
       [user_id] => 1 
      ) 
      [3] => Array 
      (
       [id] => 11402130004 
       [user_id] => 1 
      ) 
     ) 
    ) 
) 

ответ

0

Вы должны добавить user_id записи для карт, так что ваши данные будут выглядеть как-то вроде этого:

Array 
(
    [User] => Array 
     (
      [id] => 10 
     ) 
    [Card] => Array 
     (
      [0] => Array 
       (
       [id] => 1 
       [user_id] => 10 
       ) 
      [1] => Array 
       (
       [id] => 2 
       [user_id] => 10 
       ) 

     ) 
) 

Я бы за цикл Еогеасп на $ этом-> данных [ 'Card] массив:

foreach ($this->data['Card'] as &$card) { 
    $card['user_id'] = $this->data['User']['id']; 
} 

Затем вы можете сделать свое спасение. Btw, $ this-> User-> Card-> saveAll ($ this-> data) необходимо удалить.

+0

Спасибо G.J, но это не сработает! Я пробовал это раньше, но он не сохраняет user_id какую-либо идею, в чем проблема? Я использую 1.3.4 – mmahgoub

+0

@mmahgoub, что, если вы поместите массив Card вне массива User? Я не уверен, что он все равно сработает. Если этого не произойдет, возможно, вам стоит попытаться изменить способ своей работы, пытаясь сохранить Карты вместо Пользователя. Скажите, если это сработает. –

+0

Привет, GJ на самом деле это работает, если это так: 'if ($ this-> User-> saveAll ($ this-> data ['User'])) { $ this-> Session-> setFlash (__ (' Пользователь был сохранен ', true));} ', но возникает другая проблема! CakePHP не распознает невыбранные элементы, другими словами, он может связывать карты с пользователем, когда я их выбираю, но не отключается, когда я удаляю выделение! любая идея, как добиться этого без цикла foreach и saveField и такого рода вещей? – mmahgoub

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