gpt4 book ai didi

php - 两个 Eloquent ORM 实例可以操作同一个数据库表吗

转载 作者:行者123 更新时间:2023-11-29 04:21:07 25 4
gpt4 key购买 nike

我已经使用 PHP 多年,但除了使用 IPB 和 Magento 之类的东西之外,我从未真正尝试过过程式编程。我正在尝试更上一层楼,更好地理解应用程序结构、OOP 和一些常见的 PHP 框架。话虽如此,如果我的问题听起来不成熟或技术上不正确,我深表歉意,我是新手。

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

因为一个主题本质上是一系列按其 created_at 排序的链接帖子专栏,是否需要实际的 topics或者不能简单地拥有一个 parent posts 中的列 table ?主题将被识别为带有 parent 的帖子等于自己id , null0 ;否则不会被使用的东西。

如果那是数据库模式,它将如何在代码中布局,如果相关,Laravel?你还能创建一个 Topic 吗?模型?让两个模型在一张表上工作的优缺点是什么?

最后,如果您要创建它,您将如何处理它?你会用两张 table 吗?数据透视表?还有别的吗?请解释您为什么要那样实现。

最佳答案

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

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

您描述的主题-帖子关系可能更像是一对多关系,主题是所有者,甚至可能是多对多关系。这取决于以下问题的答案:“您的主题可以有很多帖子吗?您的帖子可以属于多个主题吗?”

如果您回答"is"和“否”,那么它是一对多的,主题是关系中的父项或所有者。

如果您回答"is"和"is",那么您就有了多对多关系。在 SQL 中,这些由一个表表示,该表有两列引用来自两个表的 id。

如果您回答“否”和"is",那么您就有一个一对多,帖子是关系中的父项或所有者。

在 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');
}
}

还有多态关系。

当您拥有相同的实体但类型不同时,这很有用。例如,在此表中,您可以为一名员工和一名经理制定一份保险单。 insurancePolicies 表中的 personType 列定义了保单属于谁。

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 中找到

关于php - 两个 Eloquent ORM 实例可以操作同一个数据库表吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23982854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com