何时使用 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(从这个例子看不太可能)