2012-01-04 68 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)(其中兩個參數可以是整數或數組。