Во-первых, используя Datamapper с CI, будет проще, если вы назовете таблицу «student» «student».Затем объединительная таблица 'courses_students' (спасибо Shauna).Тогда вашими моделями будут «студент» и «курс».
Контроллер формы может быть примерно таким (в идеале, вы бы поместили форму в представление):
function form() {
echo "<form method='post' action='submitForm'>";
echo "<input type='text' name='student_name'>";
echo "<select name='courses[]' multiple='multiple'>";
$c = new Course();
$c->get();
foreach($c as $course) {
echo "<option value='{$course->id}'>{$course->name}</option>";
}
echo "</select>";
echo "<input type='submit' value='Submit'>";
}
Контроллер для отправки формы (без проверки или проверок XSS):
function submitForm() {
$s = new Student();
$s->name = $this->input->post('student_name');
// an initial save to the Students table, might be omitted
$s->save();
$course_array = $this->input->post('courses');
// loop through the Courses, get them from db, and save the relationship
foreach($course_array as $k=>$v) {
$c = new Course($v);
$s->save($c);
}
}
Пара замечаний: это быстрый, грязный пример.Выполнение этих нескольких сохранений может замедлить процесс, если выбрано много курсов, и, возможно, есть способ использовать Datamapper для сохранения массива в одном операторе, но мне нужно исследовать это.