何时使用foreach循环从关系数据库检索数据,何时不使用



目前我已经完成了我的项目,这是一个使用Laravel 8的电影存储,对于这个项目,我尝试应用这些关系:

Movie AND Actor : Many To Many
Movie AND Director : Many To One
Movie AND IMDB : One To One
Movie AND Genre : Many To Many

我也将这些关系应用到了他们的模型中,也可以正确地从DB中获取数据:

@foreach(AppModelsMovie::all() as $movie)
<tr>
<th scope="row">{{ ++$menuCounter }}</th>
<td><a href="{{ $movie->link }}">{{ $movie->name }}</a></td>
<td>{{ $movie->year }}</td>
<td>
@foreach($movie->actors as $actor)
{{ $actor->name }}
@endforeach
</td>
<td>
@foreach($movie->genres as $genre)
{{ $genre->name }}
@endforeach
</td>
<td>{{ $movie->imdb->rate }}</td>
<td>{{ $movie->director->name }}</td>
</tr>
@endforeach

但我脑子里有一个问题,那就是:

何时以及在何种情况下,我必须使用foreach循环来获取数据,何时不使用foreach

例如,如果我说{{ $movie->genres->name }}而不是使用foreach循环,我将得到以下错误:

异常此集合实例上不存在属性[name]

但是,如果我尝试$movie->genres:,则此数组已经存在

[
{
"id": 2,
"name": "Thriller",
"created_at": "2021-05-01T11:17:24.000000Z",
"updated_at": "2021-05-01T11:17:24.000000Z",
"pivot": {
"movie_id": 9,
"genre_id": 2
}
}
]

那么我需要使用foreach来处理许多关系吗?在什么情况下,我可以直接使用Model中编写的方法并调用类似$movie->genres->name的属性?

我知道这个问题有点奇怪,但我需要在脑子里想清楚。。。

我知道这个问题有点奇怪,但我需要在脑海中弄清楚这件事。。。

这个问题简单明了,但由于(a(糟糕的数据模型或糟糕的DDL,以及(b(几个级别的实现问题,它变得复杂起来。让我从上往下回答,而不是从下往上回答,这是你感知它的方式

RDBMS•集合处理

Codd的关系模型是完全基于集合的。SQL(正版,标准(是RM中定义的数据子语言的格式副本,它完全基于设置。设置处理速度极快。

  • 因此,在SQL中应始终且仅使用Set Processing命令

RDBMS•过程处理

Aka逐行处理;也就是CCD_ 8处理。在极少数情况下,允许对关系数据库进行这种处理,例如银行的MonthEnd过程,即当月所有账户都被统计,并确定月末数字。程序处理极其缓慢。

  • 任何其他过程处理都会将编码器放回20世纪60年代
  • cursor是过程处理

非RDBMS

典型地,免费软件(a(滥用术语";sql";,(b(没有架构,因此没有适当的功能划分,更不用说这些功能的深度和成熟度了。因此:

  • 当给出多个表时,它就无法执行Set Processing,或者
  • 它不知道如何解析多个表的JOIN以及构造高效的QueryPlan

一些程序员通过调整SQL以获得更好的性能,或者求助于foreach处理来解决这个问题。

错误的数据模型/DDL/附加层

第二个典型的问题是在建模或DDL(好的模型,坏的DDL(或Layer(好的DDL,坏的层规范(中对表的规范不正确。例如:等错误

此集合实例上不存在异常属性[name]

这会导致Set Processing尝试失败,开发人员会采用过程处理。

当然,正确的纠正是修复模型/DDL/Layer,以便获得Set Processing和速度。

那么我需要为ManyToMany关系使用foreach吗?在什么情况下,我可以直接使用Model中编写的方法并调用类似$movie->genres->name的属性?

我不是Laravel专家(从未有过这种需要,因为我使用的是商业SQL平台(,但这是附加层的典型限制。您可以通过理解层和篡改代码来绕过它,直到它工作为止。根据评论。

我不知道Laravel是否可以进行真正的集处理(从这个例子来看,这似乎不太可能(。

最新更新