2010-10-24 2 views
2

Я пытаюсь создать систему приглашений с CakePHP. У меня есть модель приглашения, которая имеет много людей, а Person имеет одно и принадлежит для приглашения. Я считаю, что отношения работают, так как мое представление индекса приглашения может правильно обращаться и отображать связанных людей через модель приглашения. Но Вот что правила отношений похожи:Сохранение нескольких моделей в CakePHP с помощью saveAll()

class Invitation extends AppModel { 

    var $name = 'Invitation'; 
    var $hasMany = array(
     'People' => array(
      'className' => 'Person', 
      'foreignKey' => 'invitation_id', 
      'dependent'=> true 
     ) 
    ); 

    ... 
} 

class Person extends AppModel { 

    var $name = 'Person'; 
    var $hasOne = 'Invitation'; 
    var $belongsTo = 'Invitation'; 

    ... 
} 

скорректированной модель зависимости:

class Invitation extends AppModel { 

    var $name = 'Invitation'; 
    var $hasMany = array('Person'); 

    ... 
} 

class Person extends AppModel { 

    var $name = 'Person'; 
    var $belongsTo = array('Invitation'); 

    ... 
} 

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

Heres моя добавить функцию:

function add() { 

     $this->autoRender = false; 

     if($this->RequestHandler->isAjax()) { 

      $this->layout = 'ajax'; 

      if(!empty($this->data)) { 

       $this->Invitation->create(); 

      if($this->Invitation->saveAll($this->data)) { 

        //debug($this->data);  

        $this->Session->setFlash('Saved'); 
        $this->redirect('invitations/add_invitations'); 

       } else { 

        echo('Didnt save<br />'); 

       } 

     } 
     } 

} 

Вот результат моей отладки ($ this-> данные):

Array 
(
    [Invitation] => Array 
     (
      [code] => 001 
      [password] => 85c8a3735499bf91d25e5960ab4ed9deeb0b457e 
      [type] => 1 
      [num_people] => 2 
     ) 

    [Person] => Array 
     (
      [0] => Array 
       (
        [fname] => Jane 
        [lname] => Doe 

       ) 

      [1] => Array 
       (
        [fname] => John 
        [lname] => Doe 
       ) 

     ) 

) 

я не получаю никаких ошибок. данные приглашения сохраняются должным образом, но люди - нет.

ОБНОВЛЕНИЕ: Я, наконец, получил эту работу с вышеупомянутыми обновленными отношениями модели. Очевидно, что hasOne & принадлежит к правилам в модели Person, которые противоречивы. После этого я допустил ошибку (неловкую), которая препятствовала сохранению связанной с ней модели Person:

В модели приглашения я hade $ hasMany = array ('People'); когда это должно было быть $ hasMany = array ('Person').

Мне также пришлось изменить конфигурацию моей базы данных, чтобы использовать InnoDB по умолчанию, так что это, безусловно, необходимое исправление.

+0

Я думаю, что ваши лица не проходят проверки. У вас есть таблица «людей»? – bancer

+0

Попробуйте 'debug ($ this-> Invitation-> invalidFields()) после операции сохранения. – deceze

+0

У меня, конечно, есть таблица «people» с полем приглашения. Отладка, как указано выше, выводит пустой массив, поэтому я предполагаю, что это означает, что данные проверяются. –

ответ

1
var $hasOne = 'Invitation'; 
var $belongsTo = 'Invitation'; 

Эти отношения к одной и той же модели должны иметь разные Псевдонимы иначе торт будет запутаться, так как я пытаюсь распускать его. См. http://book.cakephp.org/view/1046/Multiple-relations-to-the-same-model

+0

Интересно. После более пристального изучения типов отношений я удалил правило «Person hasOne Invitation», и теперь у меня есть только «Person принадлежит для приглашения», так как здесь существует только одно отношение. Я пробовал это без правила отношений в модели приглашения, а также «Приглашение hasMany People», и оба случая получают одинаковый результат: данные приглашения сохраняются, а данные «Люди» - нет. –

+0

Также ... Я попытался отделить сохранение модели и используя $ this-> Invitation-> Person-> saveAll ($ this-> data ['Person']), и это дает мне ошибку: undefined property Invitation :: $ Человек ... или что-то в этом роде. Это, по-видимому, указывает на то, что отношения не определены должным образом, поскольку Person не доступен в приглашении. –

+0

Из книги по saveAll(): "atomic: Если true (по умолчанию), будет пытаться сохранить все записи в одной транзакции. Должно быть установлено значение false, если база данных/таблица не поддерживает транзакции. Если false, мы возвращаем массив аналогично массиву $ data, но значения имеют значение true/false в зависимости от того, успешно ли сохранена каждая запись. Также посмотрите на это: вы не можете использовать транзакционный движок: «http://dev.mysql.com /doc/refman/5.0/en/ansi-diff-transactions.html – Leo

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