hasMany vs HABTM - 自动填充复选框

时间:2011-11-24 18:17:24

标签: cakephp

所以我不确定如何以蛋糕的方式做到这一点。我已经破解了废话,如果它现在有比PHP直接更长的东西。我在文档中的任何地方都找不到这个。所以这是我的表格的设置方式:

instruments HABTM teachers
teachers HABTM instruments
instruments_teachers is my Join table

现在在instruments_teachers表中我有一个额外的字段“类型”,它指的是它是教师的主要还是辅助工具。

然后我有另一张桌子:

instrument_levels belongsTo instruments_teachers
instruments_teachers hasMany instrument_levels

总结如下:
教师可以教许多不同的教师可以教授(或教授)许多乐器和乐器。然后,教师工具的组合可以是教师的主要或辅助工具,最后可以在三个不同的级别(由instrument_levels定义)开始,中级或高级教学。

如果您认为有更好的方法来设计数据库,请告诉我,但这似乎对我有意义。

尝试将此数据与蛋糕一起使用时出现问题。我似乎无法弄明白。在我的应用程序中,教师将首先在一系列复选框中选择一个工具,但数据必须在连接表中使用额外的字段类型进行提交。现在这就是我出现复选框的方式:

控制器:

$instruments = $this->Teacher->Instrument->find('list', array('fields' => array('id', 'instrument')));
$this->set(compact('instruments'));

查看:

echo $this->Form->input('Instrument',array(
'label' => __('Instruments',true),
'type' => 'select',
'multiple' => 'checkbox',
'options' => $instruments,
'selected' => $this->Html->value('Instrument.Instrument'),
));

将所有复选框一起显示,但我希望更多控制并分别显示每个复选框(即foreach循环)。但这不起作用:

$checked = $this->Form->value('Instrument.Instrument');
echo $this->Form->label(__('Instruments', true));
foreach ($instruments as $id => $label) {
echo $this->Form->checkbox("Instrument", array(
    'checked' => (isset($checked[$id]) ? 'checked' : false),
    'hiddenField' => false,
    'value' => $id
    ));
    echo $this->Form->label("Instrument", ucfirst($label));
}

我如何使用HABTM关联提交额外字段(“type”字段)?最后,我需要有一个复选框,以便教师可以教授什么级别。所以我首先需要获取HABTM数据,然后在仪器旁边有3个复选框。看起来很简单,但如何在添加后填充这些复选框?当我获取数据时,它只是进入一个键控数组,并不与级别复选框相关联。我有一个foreach循环键入表单助手,如:InstrumentLevel.0.level,InstrumentLevel.1.level等。但是当获取数据时,它将不会正确地与复选框相关联。

我知道这很多,我一直在研究这个问题几个星期,而我只是不知道我在做什么。如果你能带领我朝着正确的方向前进,我将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:1)

您不能在联接表中添加额外字段。每次保存数据时,关联都会丢失,我引用

  麻烦的是,hasAndBelongsToMany不会支持这种类型的   场景因为当hasAndBelongsToMany关联被保存时,   关联首先被删除。你会丢失额外的数据   列,因为它没有在新插入中替换。

为此你必须使用hasMany Through association。

hasMany through (The Join Model)