我有3张桌子:
users:
id
first_name
last_name
courses:
id
name
student_courses:
id
student_id
course_id
paid
用户跟踪用户,课程跟踪课程,student_courses是显示学生注册哪些课程的表格。我目前有一个“用户”类和一个“课程”类。我的问题是:我应该创建一个StudentCourses类来处理student_courses表的交互吗?
ie:我需要创建一个函数来获取用户已注册的所有课程,将其标记为已付费等等。
最好是这样做:
$student = new User($userId);
$student->getCourses();
$student->markCourseAsPaid($courseId);
OR
$student = new User($userId);
$studentCourses = new StudentCourses($studentId);
$studentCourses->markCourseAsPaid($courseId);
等
答案 0 :(得分:4)
如果您根据对象考虑student_courses
和courses
表,您会注意到student_courses
是非常有趣的表,因为它包含学生的各个对象。它们是您希望将Student对象连接到的对象。您courses
现在拥有的只是non-changing part of a course,例如它的名字和描述。因此,您的StudentCourse
实例可以简单地聚合它。您只需要加载该实例一次,然后在StudentCourse
个实例之间共享它:
对于Cohesion,您的markAsPaid
方法应位于object with the most information required to fulfill it上。换句话说,它应该在Course
上。但是,您可以在学生上添加payForCourse
proxy method,然后在相应的markAsPaid
上调用Course
。您可能希望引入充当Repository的Courses
类。
答案 1 :(得分:3)
如果您将来要扩展应用程序,我会为StudentCourse创建单独的课程。现在除了连接属性(付费)之外,它只有一个附加属性,但是当你需要添加另一个属性时,无论如何都要创建这个类。
答案 2 :(得分:0)
我不会创建单独的类。我的方法是使用以下内容:
$student = new User($userId);
$course = new Course($courseId);
$student->markCourseAsPaid($course);
因为student_courses
表只是一个关系,所以不应该有一个额外的类。一个额外的阶级意味着它是一个实体,它不是,它是一种关系。
我的代码与您的代码不同,因为我首先获取相应的Course
实例,然后将该实例传递给用户。在我看来,仅仅传递课程的ID是很奇怪的,因为User
对象只接收一个数字作为参数,这根本没有任何意义。我们可能没有课程的ID(主键),而是辅助键。然后这个方法变得无用,因为它期望PK,而不是一些SK。因为我选择首先获取Course
对象,所以我们没有这个问题,因为Course对象确实知道如何通过辅助密钥检索正确的课程。
编辑:由于这是一种客观化的关系,因此使用额外课程可能会有一些意义。但接着我采用另一种方法:
$studentCourse = new StudentCourse($studentId, $courseId);
$studentCourse->markPaid();
由于学生ID和课程ID都构成了表的二级密钥,因此它们都应该在构造函数中指定。
答案 3 :(得分:0)
在这种情况下,它看起来可能有效。
通常你会在MVC(模型 - 视图 - 控制器)范例中使每个模型/表成为一个类(即学生,课程,用户等)。然后在每个类中,您可能有一个变量来关联它们。我不认为需要StudentCourses类,即使表结构显示关系,也不需要另一个类。第一个例子看起来更像面向我。你可以再做任何一种方式,但我总是选择更多面向对象的代码。
答案 4 :(得分:0)
我会为course_student
创建第三个类,它依赖于数据库中的table
和view
,原因如下:关注点分离。
您的视图用于所有选择,表格用于插入,更新和删除。
根据inner join
表中的关系
course_student
)(学生和课程)
一行看起来像:
student_id, student_first_name, student_last_name, courses_id, courses_name, is_paid
如果您想让所有学生参加课程,您可以使用名为getStudentsByCourse(courseId)
的方法。
如果您想获得特定学生的所有课程,您可以使用名为getStudentCourses(studentId)
的方法。
如果您需要为一门课程(或多门课程)注册一组学生,您可以使用名为setStudentsCourses(studentId, courseId)
的方法(其中两个参数可以是整数或数组。