我将从表格的结构开始。我有一个Contacts表,它使用hasOne关系与Tutors表链接。 Tutors表与Disciplines表链接,使用HABTM关系与Disciplines_Tutors作为连接表。现在,我将联系人和教师属性都集中在一个统一的联系表单中。 Disciplines表属性也是如此。会发生什么是我能够将联系人和导师保存到他们各自的表中,但是我无法保存到Disciplines_Tutors连接表中。
以下是表格结构,以便于理解:
如果从教师添加表单中保存,则不存在此问题。它完美地保存。
联系人表有: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很新。
谢谢!
答案 0 :(得分:2)
您应该使用'deep' => true
选项和saveAll()方法来保存多个关联记录。您可以尝试以下代码来保存多个关联数据:
$this->Contact->saveAll($this->data, array('deep' => true));
您也可以使用saveAssociated()方法尝试。
仅当您通过find()
方法选择任何联系人时收到与获得结果相同的数组时,它才会起作用。