laravel 5 OOP结构/架构建议

时间:2015-08-12 15:08:20

标签: php oop laravel-5

我对如何在Laravel 5中构建的应用程序实现模型结构的最佳实践提出了一般性问题。

所以,目前我的事情设置如下:

'的用户'模型和表:id,电子邮件,密码,管理员级别 - 这实际上只是验证登录的信息。

'的用户详情' model和table:id,userID(用户表id字段的外键),名称,地址等 - 所有其他细节

'的课型' model和table:id,teacherID(用户详细信息表id字段的外键),课程标签等 - 关于不同类型课程的信息

目前我有一个教师控制器,我将其传递给视图:   - 用户表格中的信息   - 用户详细信息表中的信息   - 课程类型表

中教师的不同课程类型列表

但我觉得所有这些应该与一个单独的教师模型联系在一起,这将扩展用户细节模型(并且可能反过来扩展用户模型),但不会拥有与之关联的自己的表格,但所有与用户详细信息或课程类型表的更新有关的信息都会存储在那些相关的表中。这是正确的吗?

(我还应该说用户可能是父母而不是教师,因此我会为所有属性设置单独的父母模型,以及与父母相关的内容)

然后我会将教师模型对象传递到视图中,从而可以访问所有教师信息,例如个人详细信息和课程类型数组。

正如我打字一样,这对我来说越来越像是正确的方式,但获得一些建议会很棒。

1 - 技术实现:我想在教师模型中,我将所有相关教师填充到构造函数中的类变量(名称,课程数组等)中?

2 - 我是否通过同时拥有用户和用户详细信息表来使这种结构变得复杂?

3 - 我提出的建议是否在Laravel中具有最大的结构意义?

4 - 只是我刚才有的另一个想法,如果课程类型表中的teacherID实际上是指用户表而不是用户详细信息表...那么用户详细信息和课程类型会两者都是用户表的直接子级??

非常非常有义务提供任何帮助:)

1 个答案:

答案 0 :(得分:3)

除非有明确的继承,否则不应扩展那样的模型。从逻辑的角度来看,它没有任何意义,因为无论如何你必须覆盖User模型上的大部分内容。并且您不会覆盖的内容将被错误地映射到数据库,因为它们是2个完全不同的表。你真正想要做的是利用雄辩的关系。

为清楚起见,我假设这个基本结构:

users - id
teachers - id, user_id
user_details - id, user_id
lesson_types - id, teacher_id

这些应该是使用Model::belongsTo()方法互连的4个完全不同的模型。所以Teacher模型将是

class Teacher extends Model {
    public $table = 'teachers';

    public function user() {
        return $this->belongsTo('App\User');
    }
}

当您查询教师时,您可以执行Teacher::with('user')->get()。这将返回教师表中的所有记录以及Teacher模型的每个实例,您将能够调用$teacher->user并获取与该教师关联的User实例。这是一个完整的模型,而不仅仅是额外的数据,因此您可以访问User模型上的所有内容,这通常是扩展的主要原因

您的问题列表:

  1. 我可能会误解你,但这不是ORM的工作方式。我建议回去阅读Eloquent文档(如果你运行5.0,我建议阅读5.1的文档,因为它们更好,更好)
  2. 这取决于你问的是谁,但我倾向于这么认为。如果数据明确相关且没有理由在记录类型之间共享(例如,我通常有一个addresses表,所有记录都引用而不是在多个表上重复5个地址字段),I相信它应该都在一张桌子上。如果你将它放在单独的表中,它只会使以后管理变得更加困难。

    会有人不同意并认为每个表的较小范围更好,并且可能允许对极大数据集进行更快速的查询,但我认为最终不值得额外麻烦

  3. 不,正如我上面所解释的那样
  4. teacher_id列应引用teachers表,假设课程属于教师,不能属于系统中的任何用户。使用ORM,您将能够$lesson->teacher->user->userDetails获取该数据
  5. 我真的认为你需要回过头来阅读Eloquent文档。您对Eloquent如何工作以及如何使用它的理解似乎非常基础,并且您缺少更多更精细的细节。