2011-11-24 90 views
1

所以我不知道如何以cakey的方式做到這一點。如果它現在有比直接的PHP更長的東西,我已經黑了。我無法在文檔的任何位置找到它。因此,這裏是我的表是如何設置:hasMany vs HABTM - 自動填充複選框

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協會提交額外的字段(「類型」字段)?最後,我需要有複選框,教師可以教授什麼水平。所以我首先需要獲取HABTM數據,然後在儀器旁邊有3個複選框。看起來很簡單,但是如何在添加這些複選框後填充它們?當我獲取數據時,它只會進入一個鍵控數組,並且與級別複選框無關。我把它放在一個foreach循環中,如下所示:InstrumentLevel.0.level,InstrumentLevel.1.level等等。但是當數據被提取時,它不會與複選框正確關聯。

我知道這很多,我一直在這個工作幾個星期,而我只是不知道我在做什麼。如果你能帶領我走向正確的方向,我將不勝感激!

謝謝!

回答

1

連接表中不能有額外的字段。每次保存數據的關聯丟失,我引用

麻煩的是,因爲當hasAndBelongsToMany關聯保存,在 關聯先刪除hasAndBelongsToMany不會支持這種類型的 場景。您將丟失 列中的額外數據,因爲它在新插入中未被替換。

爲此,您必須使用hasMany Through關聯。

hasMany through (The Join Model)