我已经使用PHP多年了,但除了处理像IPB和Magento这样的事情之外,从未真正冒险过程编程。我正在努力进入下一个级别,并更好地理解应用程序结构,OOP和一些常见的PHP框架。话虽如此,如果我的问题听起来不成熟或技术上不正确,我很抱歉,我是所有这一切的新手。
无论如何,我在想一个简单论坛的结构。暂时忘记类别,标签,用户,角色,高级编辑/ bbcode等,只关注主题和帖子......
由于某个主题基本上是按其created_at
列排序的一系列关联帖子,因此是否需要实际的topics
表格,或者只能在parent
列中添加posts
列。 parent
表?主题将被标识为id
等于其null
,0
或Topic
的帖子;否则将被闲置的东西。
如果那是db模式,它将如何在代码中进行布局,如果相关,Laravel?你还能创建一个{{1}}模型吗?在一张桌子上使用两个模型会有什么优缺点?
最后,如果您正在创建它,您将如何处理它?你会用两张桌子吗?数据透视表?别的什么?请解释一下为什么要这样实现它。
答案 0 :(得分:5)
对于数据库设计,自引用表是一种有效的设计模式,在嵌套层次结构的情况下很有用,例如可以包含子类别的类别,这些子类别也可以包含子类别等...在这种情况下子类别是具有父级的类别,但它们之间没有其他区别。
由您决定Topic
和Post
是否是具有父子关系的相同实体。就个人而言,我定义对象的方式我感觉不到。
您所描述的主题 - 帖子关系可能更多是一对多关系,主题是所有者,甚至可能是多对多关系。这取决于答案,“您的主题可以有很多帖子吗?您的帖子可以成为许多主题的一部分吗?”
如果您回答是和否,那么这是一对多,主题是父亲在关系中的所有者。
如果您的回答是肯定的,那么您就拥有多对多的关系。在SQL中,这些表由一个表组成,该表有两列引用两个表中的id。
如果你的回答是否定,那么你就有一对一的帖子是关系中父母的所有者。
在laravel中,根据关系,您的模型将包含一个如下所示的方法:
一对多:
class Topic extends Eloquent
{
public function posts()
{
return $this->hasMany('Post');
}
}
Laravel One-to-Many Relationships
多对多:
在laravel中,术语“数据透视表”指的是引用其他对象的表。
class Post extends Eloquent
{
public function topics()
{
return $this->belongsToMany('Topic');
}
}
class Topic extends Eloquent
{
public function posts()
{
return $this->belongsToMany('Post');
}
}
Laravel Many-to-Many
自我引用模型:
对于像我之前解释过的自引用父子关系,你可以创建这样的东西,因为你可以看到它只是一对多和同一模型中的多对一。
class Category extends Eloquent
{
public function parent()
{
return $this->belongsTo('Category', 'parent_id');
}
public function children()
{
return $this->hasMany('Category', 'parent_id');
}
}
还有多态关系。
当您使用不同类型的相同实体时,这非常有用。例如,在此表中,您可以为员工和经理制定保险单。 personType
表中的insurancePolicies
列定义了保险单所属的人。
来自codecommit.com的图片
在这种情况下,我们的laravel模型看起来像:
class InsurancePolicy extends Eloquent
{
public function insurable()
{
return $this->morphTo();
}
}
class Manager extends Eloquent
{
public function insurance()
{
return $this->morphMany('InsurancePolicy', 'person');
}
}
class Employee extends Eloquent
{
public function insurance()
{
return $this->morphMany('InsurancePolicy', 'person');
}
}
我所解释的大部分内容也可以在laravel docs
中找到