两个Eloquent ORM实例可以操作相同的DB表

时间:2014-06-01 18:07:32

标签: php mysql laravel eloquent

我已经使用PHP多年了,但除了处理像IPB和Magento这样的事情之外,从未真正冒险过程编程。我正在努力进入下一个级别,并更好地理解应用程序结构,OOP和一些常见的PHP框架。话虽如此,如果我的问题听起来不成熟或技术上不正确,我很抱歉,我是所有这一切的新手。

无论如何,我在想一个简单论坛的结构。暂时忘记类别,标签,用户,角色,高级编辑/ bbcode等,只关注主题和帖子......

由于某个主题基本上是按其created_at列排序的一系列关联帖子,因此是否需要实际的topics表格,或者只能在parent列中添加posts列。 parent表?主题将被标识为id等于其null0Topic的帖子;否则将被闲置的东西。

如果那是db模式,它将如何在代码中进行布局,如果相关,Laravel?你还能创建一个{{1}}模型吗?在一张桌子上使用两个模型会有什么优缺点?

最后,如果您正在创建它,您将如何处理它?你会用两张桌子吗?数据透视表?别的什么?请解释一下为什么要这样实现它。

1 个答案:

答案 0 :(得分:5)

对于数据库设计,自引用表是一种有效的设计模式,在嵌套层次结构的情况下很有用,例如可以包含子类别的类别,这些子类别也可以包含子类别等...在这种情况下子类别是具有父级的类别,但它们之间没有其他区别。

由您决定TopicPost是否是具有父子关系的相同实体。就个人而言,我定义对象的方式我感觉不到。

您所描述的主题 - 帖子关系可能更多是一对多关系,主题是所有者,甚至可能是多对多关系。这取决于答案,“您的主题可以有很多帖子吗?您的帖子可以成为许多主题的一部分吗?”

如果您回答是和否,那么这是一对多,主题是父亲在关系中的所有者。

如果您的回答是肯定的,那么您就拥有多对多的关系。在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列定义了保险单所属的人。

Polymorphic relationship

来自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

中找到