【问题标题】:Is it OK to make a class/object for a database table? [closed]可以为数据库表创建一个类/对象吗? [关闭]
【发布时间】:2011-10-17 12:56:48
【问题描述】:

我是站点构建者,我有一些表,是否可以始终基于该表构建一个类并为其创建一个对象?我有一个 teacher 表 (ID, USERNAME) 和一个基于它的类有 giveMark()editMark() 等。另一个是 student (ID,NAME) 表, getMarks(), getMissingHours() 等。现在由于学生和老师之间存在 N:M 关系,我有一个 link_teacher_student (ID,TEACHED_ID,STUDENT_ID) 表,它是一个“助手” “ 桌子。我也应该为它创建类/对象吗?

【问题讨论】:

标签: php database oop class object


【解决方案1】:

,您不应该拥有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();
}

然后在获取TeacherStudent 时,您将使用DataMapper 来初始化该数组,例如您的 DAO 将查询教师和 join the students,然后映射器将 create Student objects 并将它们填充到教师中的该数组中。

您可以做的是将$students$teachers 变成Repositories 并给他们 finder 方法来查询查找表,例如

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;
    }
}

【讨论】:

    【解决方案2】:

    这取决于您的代码需要多少功能。如果您的网络应用需要基于不同用户类型的大量功能,我会为每个用户类型创建不同的模型和控制器。如果用户类型之间的功能差异不大,您可以只使用一个统一类,并采用更多方法来区分。

    我也只需将 teacher_id 列添加到学生表 - 您无需创建一个全新的表来映射关系。

    【讨论】:

      【解决方案3】:

      是的。这样做不仅可以,将数据层(或模型)与其余代码分开也是一个好主意。

      这样做意味着您可以编写更少的代码来完成更多工作,因为您不必到处重复相同的代码,这意味着您只需担心在需要更改时更新一段代码你的模型以某种方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-14
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 2021-05-03
        相关资源
        最近更新 更多