2012-01-04 71 views
3

我有3个表:PHP OOP:创建一个新的类?

users: 
id 
first_name 
last_name 

courses: 
id 
name 

student_courses: 
id 
student_id 
course_id 
paid 

用户可以跟踪用户,课程跟踪课程,并student_courses是显示了学生已经签署了该课程表。我目前有一个“用户”课程和一个“课程”课程。我的问题是:我应该创建一个StudentCourses类来处理student_courses表的交互吗?

即:我需要创建得到了用户已经注册了所有课程的功能,将它们标记为已付款,等

它是最好做:

$student = new User($userId); 
$student->getCourses(); 
$student->markCourseAsPaid($courseId); 

OR

$student = new User($userId); 
$studentCourses = new StudentCourses($studentId); 
$studentCourses->markCourseAsPaid($courseId); 

回答

4

如果你认为你的student_coursescourses你会注意到student_courses是一个非常有趣的表格,因为它包含了学生的单独对象,它们是你希望让你的学生对象连接到的东西,你现在在courses中只有non-changing part of a course ,例如它的名字和描述,因此,你的StudentCourse实例可以简单地聚合它,你只需要加载一次,然后在StudentCourse个实例:

Student hasMany Courses hasOne CourseDescription

Cohesion,您markAsPaid方法应该是在object with the most information required to fulfill it。换句话说,它应该在Course。但是,您可以在Student上添加一个payForCourseproxy method,然后在适当的Course上调用markAsPaid。您可能需要引入一个作为RepositoryCourses类。

+0

我想我明白你的意思。你会如何建议用以下方式签署一门课程:$ student = new Student($ studentId); $ course = new Course($ courseId); – execv 2012-01-05 04:17:49

0

我不能创建单独的类。我的方法是使用类似以下内容:

$student = new User($userId); 
$course = new Course($courseId); 
$student->markCourseAsPaid($course); 

由于student_courses表只是只是一段感情,不应该有一个额外的类。一个额外的类将意味着它是一个实体,不是,它是一种关系。

我的代码与您的代码不同,因为我第一次获取适当的Course实例,然后将该实例传递给用户。在我看来,仅仅传递课程的ID很奇怪,因为User对象只是收到一个数字作为参数,根本没有意义。我们可能不需要课程的ID(主键),而是辅助键。然后这个方法变得没用,因为它期望PK,而不是一些SK。因为我选择首先获取Course对象,所以我们没有这个问题,因为课程对象确实知道如何通过辅助键检索正确的课程。

编辑:由于这是一个客观的关系,所以在使用额外的类时可能会有一些问题。但后来我想用另一种方法去:

$studentCourse = new StudentCourse($studentId, $courseId); 
$studentCourse->markPaid(); 

由于两个学生ID和课程ID弥补表的辅助键,它们都应该在构造函数中指定。

+0

不会丢弃第2行,'$ student-> markCourseAsPaid($ courseId);'是一个更好的选择......不需要为这个命令加载课程信息(完成与数据库之旅),除非'新的课程($ courseId);'使用延迟加载(这实际上是相同的,而不是创建它) – Rudu 2012-01-04 17:52:49

+0

@Rudu是我正在解释;)我的确希望ORM类足够聪明,不加载任何值,直到他们实际上被要求。 – Joost 2012-01-04 18:05:58

0

那么在这种情况下,它看起来像任一可能工作。

通常,您会在MVC(模型 - 视图 - 控制器)范例中为每个模型/表创建一个类(即学生,课程,用户等)。然后在每个班级你可能有一个变量来关联它们。即使表结构显示关系,我不认为需要StudentCourses类,应该不需要另一个类。第一个例子看起来更加面向对象。再一次,你可以做到这一点,但我总是自己选择更多面向对象的代码。

3

如果您将来要扩展应用程序,我会为StudentCourse创建单独的类。现在除了连接属性(付费)之外,它只有一个附加属性,但是当您需要添加其他属性时,您仍然可以创建此类。

0

我会为course_student创建第三个类,它将依靠数据库上的tableview,这是因为以下原因导致问题分离。

您查看用于所有选择和表插入,更新和删除。

你的观点将在您的course_student表由两个表(使用2 inner join)的基础上的关系(学生和课程)的所有相关领域的

一行看起来像:

student_id, student_first_name, student_last_name, courses_id, courses_name, is_paid 

如果你想让所有的学生参加课程,你可以有一个名为getStudentsByCourse(courseId)的方法。

如果你想获得一个特定学生的所有课程,你可以有一个名为getStudentCourses(studentId)的方法。

如果您需要注册一组的学生为一疗程(或多个)可以有一个方法叫setStudentsCourses(studentId, courseId)(其中两个参数可以是整数或数组。