我是一个站点构建者,我有一些表,并且可以根据该表总是构建一个类并创建一个对象吗?我有一个教师表(ID,USERNAME)和一个基于它的课程giveMark()
,editMark()
等。另一个是学生(ID ,NAME)表格,getMarks()
,getMissingHours()
等。由于学生和教师之间存在N:M关系,我有一个 link_teacher_student (ID,TEACHED_ID,STUDENT_ID)表,而不是一个“帮手”表。我也应该为它创建类/对象吗?
答案 0 :(得分:3)
否,您不应该有link_teacher_student
表的对象。 This is common thing to do in a RDBMS structure, but not in an OOP model. OOP模型中的相同关系是简单的:
class Teacher {
protected $students = array();
}
class Student {
protected $teachers = array();
}
然后,您可以在获取Teacher
或Student
时使用DataMapper初始化该数组,例如您的DAO会查询教师和join the students,然后Mapper会create Student objects并将其填充到教师的数组中。
你可以做的是将$students
或$teachers
变成Repositories并给他们查询查询表的方法,例如
class Teacher
…
public function __construct($studentsRepository)
{
$this->students = $studentRepository;
}
public function getStudents()
{
return $this->students->findByTeacherId($this->id);
}
}
class StudentRepository
…
public function findByTeacherId($teacherId)
{
foreach ($this->dao->select('SELECT …', $teacherId) as $student) {
$students[] = $this->studentBuilder->build($student);
}
return $students;
}
}
答案 1 :(得分:2)
是。这样做不仅可以,将数据层(或模型)与其余代码分开是一个好主意。
这样做意味着您可以编写更少的代码来完成更多工作,因为您不必在整个地方重复相同的代码,这意味着您只需要担心在需要更改时更新一段代码你的模型在某种程度上。
答案 2 :(得分:0)
这取决于您的代码需要多少功能。如果您的网络应用程序要求基于不同用户类型的许多功能,我会为每个用户创建不同的模型和控制器。如果用户类型之间的功能没有太大差异,您可以使用一个统一的类,使用更多的方法来区分。
我也只是将teacher_id
列添加到学生表中 - 您不需要创建一个全新的表来映射关系。