hasManyとHABTMの違い - 自動入力するチェックボックス

だから私はケーキな方法でこれを行う方法がわかりません。私はそれが今すぐストレートPHPよりも長い何かを持っている場合は、ひどいことをハッキングしました。私はドキュメントのどこにでもこれを見つけることができません。ここで私のテーブルがどのように設定されているのです:

instruments HABTM teachers
teachers HABTM instruments
instruments_teachers is my Join table

今instrument_teachersテーブルには、それが教師のプライマリまたはセカンダリのどちらであるかを示す追加のフィールド「タイプ」があります。

私は別のテーブルを持っています:

instrument_levels belongsTo instruments_teachers
instruments_teachers hasMany instrument_levels

だから要約:
教師は多くの楽器を教えることができ、楽器は多くの異なる教師に属する(または教えられる)ことができます。次に、教師用楽器の組み合わせは、教師用のプライマリまたはセカンダリ楽器のいずれかであり、最終的にその組み合わせは、3つの異なるレベル(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つのチェックボックスを機器の隣に置く必要があります。十分に簡単だと思われますが、追加された後にこれらのチェックボックスを設定するにはどうすればよいですか?データをフェッチすると、キー配列に入り、レベルチェックボックスには関連付けられません。私はフォームヘルパーのように:InstrumentLevel.0.level、InstrumentLevel.1.levelなどのキーを使用してforeachループでそれを持っています。しかし、データがフェッチされると、チェックボックスと正しく相関しません。

私はこれがたくさんあったことを知っています、私はこれで数週間働いています、そして、私は何をしているのでもありません。あなたが正しい方向に私を導くことができたら、私はそれを感謝します!

ありがとう!

1

1 答え

ジョインテーブルに余分なフィールドを持つことはできません。データを保存するたびに関連が失われるため、私は

問題は、hasAndBelongsToManyはこのタイプの   シナリオはhasAndBelongsToMany関連が保存されると、   最初に関連付けが削除されます。余分なデータは失われます   列は新しい挿入物に置き換えられません。

そのためには、hasMany Through Associationを使用する必要があります。

hasMany through(結合モデル)

1
追加された