hasMany против HABTM - Автоматическое заполнение флажков - PullRequest
1 голос
/ 24 ноября 2011

Так что я не уверен, как сделать это в виде торта.Я взломал дерьмо, если это и теперь есть что-то длиннее, чем прямой 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

Итак, в заключение:
Учитель может учить многим инструментам, и инструменты могут принадлежать (или обучаться) множеству разных учителей.Тогда комбинация инструмента учителя является либо основным, либо вторым инструментом учителя, и, наконец, эту комбинацию можно преподавать на трех разных уровнях (определяемых уровнями инструмента) - начальном, среднем или продвинутом.

Дайте мне знать, если вы думаетеЕсть лучший способ спроектировать базу данных, но мне кажется, что это имеет смысл.

Проблема возникает при попытке использовать эти данные с помощью cake.Я не могу понять это.В моем приложении учителя сначала выбирают инструмент из серии флажков, но данные должны быть представлены с дополнительным типом поля в таблице соединений.Прямо сейчас вот как у меня появляются флажки:

Контроллер:

$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'),
));

Это отображает все флажки вместе, но я быкак больше контроля и отображения каждого на отдельно (т.е. цикл по каждому элементу).Это не работает, хотя:

$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));
}

И как бы я отправил дополнительное поле (поле "type") с ассоциацией HABTM?Наконец, мне нужно иметь флажки для того, на каком уровне учителя могут учить.Поэтому мне сначала нужно получить данные HABTM, а затем установить 3 флажка рядом с инструментом.Кажется, достаточно просто, но как мне установить эти флажки после их добавления?Когда я выбираю данные, они просто помещаются в массив с ключами и не соотносятся с флажками уровня.У меня есть это в цикле foreach, ключом которого является помощник по форме: InstrumentLevel.0.level, InstrumentLevel.1.level и т. Д. Но когда данные извлекаются, они не будут корректно соотноситься с флажками.

Я знаю, что это было много, я работал над этим пару недель, и я просто не делаю то, что я делаю.Если бы вы могли привести меня в правильном направлении, я был бы признателен за это!

Спасибо!

1 Ответ

1 голос
/ 25 ноября 2011

Вы не можете иметь дополнительное поле в таблице соединений.Каждый раз, когда вы сохраняете свои данные, ассоциации теряются, я цитирую

Проблема в том, что hasAndBelongsToMany не будет поддерживать этот тип сценария, поскольку при сохранении ассоциаций hasAndBelongsToMany сначала удаляется связь.Вы потеряете дополнительные данные в столбцах, поскольку они не будут заменены в новой вставке.

Для этого необходимо использовать ассоциацию hasMany Through.

hasMany through (TheПрисоединяйтесь к модели)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...