【问题标题】:HasOne and HasAndBelongsToMany Not SavingHasOne 和 HasAndBelongsToMany 不保存
【发布时间】:2012-08-15 04:03:54
【问题描述】:

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

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

如果从 Tutors 添加表单保存,则不会出现此问题。它完美保存。

联系人表有:id,自己的属性
Tutors 表有: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' => ''
    )
);

学科导师模型:

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 还很陌生。

谢谢!

【问题讨论】:

  • 你写了什么代码来保存相关记录?
  • @ArunJain 我已经使用 saveAll 来保存记录。 public function add() { if(!empty($this->data)){ if ($this->Contact->saveAll($this->data)){ $this->Session->setFlash(__('The contact has been saved')); $this->redirect(array('action' => 'index')); } else{ $this->Session->setFlash(__('The contact could not be saved. Please try again.')); } }

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


【解决方案1】:

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

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

你也可以用saveAssociated()方法试试。

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

【讨论】:

  • 嗨,我用过$this->Contact->saveAll($this->data, array('deep'=>true)),但还是不行。
  • 只有当您在通过find() 方法选择任何联系人时收到与获得结果相同的数组时,它才会起作用。
  • 对不起。我不明白。我有这个:$disciplines = $this->Contact->Tutor->Discipline->find('list'); $this->set(compact('disciplines'));我需要做什么吗?
  • 改成这样:$disciplines = $this->Contact->Tutor->Discipline->find('list',array('fields'=>array('Discipline.discipline'))); $this->set(compact('disciplines')); 也无济于事
  • deep 选项不适用于 save(),仅适用于 saveAll 和朋友,并且仅适用于 2.1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
相关资源
最近更新 更多