HasOne和HasAndBelongsToMany不保存

时间:2012-08-19 14:27:18

标签: cakephp has-and-belongs-to-many save has-one

我将从表格的结构开始。我有一个Contacts表,它使用hasOne关系与Tutors表链接。 Tutors表与Disciplines表链接,使用HABTM关系与Disciplines_Tutors作为连接表。现在,我将联系人和教师属性都集中在一个统一的联系表单中。 Disciplines表属性也是如此。会发生什么是我能够将联系人和导师保存到他们各自的表中,但是我无法保存到Disciplines_Tutors连接表中。

以下是表格结构,以便于理解:

Tables Structure

如果从教师添加表单中保存,则不存在此问题。它完美地保存。

联系人表有:id,它自己的属性
导师表有:id,自己的属性,contact_id
学科表有:id,纪律
Disciplines_Tutors表有:id,discipline_id,tutor_id

在统一联系表格中,我可以查看可用的学科,并可以进行选择。但是在保存时,它不会保存到连接表中。

导师模特:

public $hasAndBelongsToMany = array(
    'Discipline' => array(
        'className' => 'Discipline',
        'joinTable' => 'disciplines_tutors',
        'foreignKey' => 'tutor_id',
        'associationForeignKey' => 'discipline_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )
);

纪律模型:

public $hasAndBelongsToMany = array(
    'Tutor' => array(
        'className' => 'Tutor',
        'joinTable' => 'disciplines_tutors',
        'foreignKey' => 'discipline_id',
        'associationForeignKey' => 'tutor_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )
);

DisciplinesTutor Model:

public $belongsTo = array(
    'Tutor' => array(
        'className' => 'Tutor',
        'foreignKey' => 'tutor_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Discipline' => array(
        'className' => 'Discipline',
        'foreignKey' => 'discipline_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

ContactsController有:

    $disciplines = $this->Contact->Tutor->Discipline->find('list');

在公共功能添加部分。因此,使选择列表的检索成为可能。

Tutors,Disciplines,DisciplinesTutors控制器都使用saveAll方法。

在统一联系表单的添加表单中。它有:

echo $this->Form->input('Tutor.Discipline',array('type'=>'select','multiple'=>true));

允许我检索可供选择的学科列表。

我不确定还需要哪些其他信息。随意提问,我会将它们添加到这个问题中。

另外,请对我很轻松,因为我对CakePHP很新。

谢谢!

1 个答案:

答案 0 :(得分:2)

您应该使用'deep' => true选项和saveAll()方法来保存多个关联记录。您可以尝试以下代码来保存多个关联数据:

 $this->Contact->saveAll($this->data, array('deep' => true));

您也可以使用saveAssociated()方法尝试。

仅当您通过find()方法选择任何联系人时收到与获得结果相同的数组时,它才会起作用。