何时使用 foreach 循环从关系数据库中检索数据,何时不使用
When to use foreach loop for retrieving data from relational database and when not to
目前我已经完成了我的项目,这是一个 电影存储 和 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
我也将这些关系应用于他们的模型,并且还可以正确地从数据库中获取数据:
@foreach(\App\Models\Movie::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
循环,我将得到这个错误:
Exception Property [name] does not exist on this collection instance
但是如果我尝试这个数组已经存在 $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
吗?在什么情况下我可以直接使用模型中编写的方法并调用 属性 like $movie->genres->name
?
我知道这个问题有点奇怪,但我需要在脑海中弄清楚这件事...
I know this question is kinda weird, but I need to make this thing clear in my head...
这个问题是一个简单、直接的问题,但由于 (a) 错误的数据模型或错误的 DDL,以及 (b) 多个级别的实施问题而变得复杂。让我从上到下回答,而不是从下到上,这是您的看法。
RDBMS • 设置处理
Codd 的关系模型 完全基于集合。 SQL(正版,标准)是 RM 中定义的数据子语言的再现,它完全基于集合。设置处理速度极快。
- 因此,应该始终且仅在 SQL
中使用设置处理命令
RDBMS • 过程处理
又名逐行处理;又名 foreach
处理。在极少数情况下,允许针对关系数据库进行这种处理,例如。银行的 MonthEnd 程序,当所有账户都在该月进行统计,并确定月末数字。程序处理速度极慢。
- 任何其他程序处理都会使编码器回到 1960 年代
- A
cursor
是程序处理。
非 RDBMS
免费软件通常 (a) 滥用术语“sql”,并且 (b) 没有体系结构,因此没有适当的功能隔离,更不用说这些功能的深度和成熟度了。因此:
- 就是给定的表多了,就无法进行集合处理,或者
- 它无法弄清楚如何解析多个表的 JOIN,并构建一个高效的
QueryPlan
。
一些程序员通过调整 SQL 以获得更好的性能,或者求助于 foreach
处理来解决这个问题。
错误数据Model/DDL/Additional层
第二个典型问题是表的规范不正确,无论是在建模还是 DDL(好的模型,坏的 DDL)或层(好的 DDL,坏的层规范)。例如。错误如:
Exception Property [name] does not exist on this collection instance
这导致设置处理尝试失败,开发人员求助于程序处理。
正确的修正当然是修正Model/DDL/Layer,让你获得Set Processing和速度。
So do I need to use foreach
for ManyToMany relationships ? At what cases I can straightly use the method written in the Model and call the property like $movie->genres->name
?
我不是 Laravel 专家(从来不需要,因为我使用商业 SQL 平台),但这是附加层中的典型限制。您可以通过了解层并修改代码来绕过它,直到它起作用。根据评论。
不知道Laravel能不能做真正的Set Processing(从这个例子看不太可能)
目前我已经完成了我的项目,这是一个 电影存储 和 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
我也将这些关系应用于他们的模型,并且还可以正确地从数据库中获取数据:
@foreach(\App\Models\Movie::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
循环,我将得到这个错误:
Exception Property [name] does not exist on this collection instance
但是如果我尝试这个数组已经存在 $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
吗?在什么情况下我可以直接使用模型中编写的方法并调用 属性 like $movie->genres->name
?
我知道这个问题有点奇怪,但我需要在脑海中弄清楚这件事...
I know this question is kinda weird, but I need to make this thing clear in my head...
这个问题是一个简单、直接的问题,但由于 (a) 错误的数据模型或错误的 DDL,以及 (b) 多个级别的实施问题而变得复杂。让我从上到下回答,而不是从下到上,这是您的看法。
RDBMS • 设置处理
Codd 的关系模型 完全基于集合。 SQL(正版,标准)是 RM 中定义的数据子语言的再现,它完全基于集合。设置处理速度极快。
- 因此,应该始终且仅在 SQL 中使用设置处理命令
RDBMS • 过程处理
又名逐行处理;又名 foreach
处理。在极少数情况下,允许针对关系数据库进行这种处理,例如。银行的 MonthEnd 程序,当所有账户都在该月进行统计,并确定月末数字。程序处理速度极慢。
- 任何其他程序处理都会使编码器回到 1960 年代
- A
cursor
是程序处理。
非 RDBMS
免费软件通常 (a) 滥用术语“sql”,并且 (b) 没有体系结构,因此没有适当的功能隔离,更不用说这些功能的深度和成熟度了。因此:
- 就是给定的表多了,就无法进行集合处理,或者
- 它无法弄清楚如何解析多个表的 JOIN,并构建一个高效的
QueryPlan
。
一些程序员通过调整 SQL 以获得更好的性能,或者求助于 foreach
处理来解决这个问题。
错误数据Model/DDL/Additional层
第二个典型问题是表的规范不正确,无论是在建模还是 DDL(好的模型,坏的 DDL)或层(好的 DDL,坏的层规范)。例如。错误如:
Exception Property [name] does not exist on this collection instance
这导致设置处理尝试失败,开发人员求助于程序处理。
正确的修正当然是修正Model/DDL/Layer,让你获得Set Processing和速度。
So do I need to use
foreach
for ManyToMany relationships ? At what cases I can straightly use the method written in the Model and call the property like$movie->genres->name
?
我不是 Laravel 专家(从来不需要,因为我使用商业 SQL 平台),但这是附加层中的典型限制。您可以通过了解层并修改代码来绕过它,直到它起作用。根据评论。
不知道Laravel能不能做真正的Set Processing(从这个例子看不太可能)