【发布时间】:2021-07-24 15:17:46
【问题描述】:
目前我已经使用 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 循环,我会得到这个错误:
异常此集合实例上不存在属性 [名称]
但是如果我尝试$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这样的属性?
我知道这个问题有点奇怪,但我需要在脑海中说清楚这件事......
【问题讨论】:
-
我不太明白这个问题。当你有集合时,你需要迭代它们。如果您确定一个集合只有一个元素,则获取第一个元素并访问其属性。
-
因为
$movie->genres不是您的流派模型的实例。它是 Collection 对象的一个实例,其 elements 是 Genre 的实例。把它想象成一个对象数组。您无法访问数组本身的对象属性。您需要先获取特定对象才能访问其属性。 -
简单地说..你想访问与其他模型有很多或多对多关系的数据..那么你需要使用foreach,因为你正在检索有很多关系(数据) ,,, 电影演员示例
-
取决于您如何定义关系。如果它是*对一,您将获得模型的实例。如果它是*对多,你会得到一个集合。
-
我还要补充一些提示:永远不要使用
\App\Models\Movie::all(),你可以拥有10000,这会炸毁任何人的电脑(查看内容时),尤其是你的服务器,你应该使用@ 987654321@ 并且每次调用不超过 100,此外,因为您有关系,您遇到查询问题,您运行的查询比您应该运行的要多,要解决此问题,您可以使用with(称为 @987654338 @)。
标签: php laravel foreach relational-database laravel-8