Код Воспламенитель отношений - PullRequest
0 голосов
/ 28 декабря 2011

Я начинаю изучать среду PHP Code Igniter, у меня довольно простой вопрос, и у меня возникают проблемы с поиском хорошего примера кода в Интернете.

Допустим, у меня есть две простые таблицы базы данных (учитель и ученик). У каждого есть поле уникального идентификатора (t_id и s_id). У каждого учащегося есть учитель, поэтому в таблице учеников есть поле s_t_id, в котором указывается, какой учитель имеет ученик.

Я хочу иметь экран, на котором перечислены все учителя с их учениками под ними. Вроде как учитель - это заголовок, а ученики, принадлежащие этому учителю, - это подзаголовки.

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

У меня есть модель для учителя и ученика, и у каждого есть контроллер.

Но я загружаю все данные для них обоих в представлении для учителя. Мой код контроллера учителя выглядит примерно так:

$data['teachers'] = $this->teachers_model->get_teachers();
$data['students'] = $this->students_model->get_students();

На мой взгляд, я просто зацикливаю учителей и получаю учеников для каждого учителя в каждой итерации из массива, передаваемого в представление.

Похоже ли это на правильный способ сделать это в соответствии с шаблонами MVC? Или это просто взлом? Мне немного неловко загружать учеников в контроллер для учителей.

Ответы [ 3 ]

0 голосов
/ 29 декабря 2011

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

Teacher1
  Student1
  Student2
Teacher2
  ....

Я думаю, вам нужно подобное:

 SELECT teacher.name, GROUP_CONCAT(student.name) AS students
 FROM teacher
 JOIN student ON teacher.t_id=student.s_t_id
 GROUP BY teacher.t_id

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

После этого вы можете использовать explode , так что у вас будет массив из учеников указанного учителя.

Таким образом, вы можете решить вашу проблему с помощью одного sql-запроса и некоторой (равной количеству учителей) функции разнесения в php.

0 голосов
/ 19 апреля 2013

Ок, я бы так поступил на твоем месте,

База данных

Стол ученический

id         : 1
name       : David
teacher_id : 2

Учительский стол

id          :1
name        : Sean

id          : 2
name        : Rose

Ваш контроллер // Я загружаю представление с именем "view / index.php"

function index()
{
   $data['teachers'] = $this->teachers_model->get_teachers();
   $data['students'] = $this->students_model->get_students();
   $this->load->view('index',$data);
}

Ваш взгляд

<?php

                foreach ($teacher as $t)
                {
                   echo 'Teacher Name:'.$t['name'];
                   echo '<br>';
                   foreach ($students as $s)
                   {
                       if($s['teacher_id]==$t['id'])
                       {
                            echo 'Student Name:'.$s['name'];
                            echo '<br>';
                       }
                   }
               }
    ?>
0 голосов
/ 28 декабря 2011

Посмотрите пакет sparks ( php-activerecord )

Это делает достойную работу по картированию отношений

модели / Teacher.php { Названия моделей = единственное число (учитель), таблицы БД = множественное число (учителя) }

class Teacher extends ActiveRecord\Model
{
    public static $has_many = array(array('Student'));

    //alternative is not to include where(conditions) clause

    public static function get_student_list($teacher_id){
         return (array) self::find(
                        'all', array(
                        'include'=>array('student'), //eager loading
                        'conditions'=>array('id=?', $teacher_id))
                         )->students;
    }
}

Модели / Student.php

class Student extends ActiveRecord\Model
{
    public static $belongs_to = array(array('Teacher'));

}

Контроллер учителя

class Teacher extends CI_Controller
{
public function __construct(){parent::__construct();}

public function index()
{
    $this->load->view('teachers/_index', array(
          'students' => Teacher::get_student_list($this->teacher_id)
    ));
}
}

Чтобы это сработало, прочитайте вики php-activerecord

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