Laravel 关系,多对多或有许多通过?
Laravel relationships, Many to Many or Has Many Through?
我正在使用 Laravel 8 构建一个 Web 应用程序,我倾向于努力解决的一件事是复杂的关系和访问数据。我已经开始阅读 hasManyThrough
关系,但我不相信这是适合我的情况的正确方法。
旅行推销员使用该应用程序在他们安全到达时签到一个位置。
我有三个主要的table:
Locations
(他们访问的地方),
Checkins
(存储签到数据的位置,例如时间),
Users
这是它变得有点复杂的地方,我发现自己无法只见树木不见森林...
- 位置有很多用户,用户有很多位置。 Many-to-many 枢轴 table 已创建。
- Locations have many check in, check in have many locations. Many-to-many 枢轴 table 已创建。
- 签到有很多用户,用户有很多签到。 Many-to-many 枢轴 table 已创建。
因此它们都是使用 belongsToMany
关系创建的。
现在我想做的是访问 check in
的 user
这样我就可以调用类似于 show.blade.php
:
的东西
<tbody>
@foreach($location->checkins as $checkin)
<tr>
<td>{{ $checkin->id }}</td>
<td>{{ $checkin->users()->name }}</td> // I'd like to get the users name
<td>{{ $checkin->longitude }}</td>
<td>{{ $checkin->latitude }}</td>
<td>{{ \Carbon\Carbon::parse($checkin->created_at)->format('jS F Y') }}</td>
</tr>
@endforeach
</tbody>
hasManyThrough
关系是我实现此目标的唯一途径吗?还是我应该让我的控制器更有创意一点,让用户自己通过 collection?
我当前的 Location
控制器如下所示:
public function show(Location $location)
{
$page_title = "Locations";
$page_description = "Event locations.";
return view('pages.admin.locations.show', compact('page_title', 'page_description'))
->with('location' => $location);
}
欢迎任何指导或最佳实践建议。
您说“签到有很多用户”,您似乎希望单个用户签到,但目前这会导致很多用户。听起来用户签到是多对一的关系
另外 $checkin->created_at
默认是一个碳对象,所以你可以去 $checkin->created_at->format('jS F Y')
也不要混合使用 compact
和 with
,保持一致,只使用 1,因为它们可以达到相同的目的
另外 $checkin->users()->name
也不起作用,如果你在语法上使用括号只是 returns 一个查询生成器实例,你需要像 $checkin->users()->get()
一样调用它,或者您可以使用 $checkin->users
无论如何都会获取它们。如果您想更深入地研究,您可能需要研究在查询构建器实例上使用 with('relation')
来停止 N+1 查询。最后,$checkin->users()->get()->name
也不起作用,因为您的用户关系是多对多的,其中 returns 是一个集合,这再次指向您应该有一个名为 user
的 belongsTo 关系,但没有主元 [=30] =]
我正在使用 Laravel 8 构建一个 Web 应用程序,我倾向于努力解决的一件事是复杂的关系和访问数据。我已经开始阅读 hasManyThrough
关系,但我不相信这是适合我的情况的正确方法。
旅行推销员使用该应用程序在他们安全到达时签到一个位置。
我有三个主要的table:
Locations
(他们访问的地方),Checkins
(存储签到数据的位置,例如时间),Users
这是它变得有点复杂的地方,我发现自己无法只见树木不见森林...
- 位置有很多用户,用户有很多位置。 Many-to-many 枢轴 table 已创建。
- Locations have many check in, check in have many locations. Many-to-many 枢轴 table 已创建。
- 签到有很多用户,用户有很多签到。 Many-to-many 枢轴 table 已创建。
因此它们都是使用 belongsToMany
关系创建的。
现在我想做的是访问 check in
的 user
这样我就可以调用类似于 show.blade.php
:
<tbody>
@foreach($location->checkins as $checkin)
<tr>
<td>{{ $checkin->id }}</td>
<td>{{ $checkin->users()->name }}</td> // I'd like to get the users name
<td>{{ $checkin->longitude }}</td>
<td>{{ $checkin->latitude }}</td>
<td>{{ \Carbon\Carbon::parse($checkin->created_at)->format('jS F Y') }}</td>
</tr>
@endforeach
</tbody>
hasManyThrough
关系是我实现此目标的唯一途径吗?还是我应该让我的控制器更有创意一点,让用户自己通过 collection?
我当前的 Location
控制器如下所示:
public function show(Location $location)
{
$page_title = "Locations";
$page_description = "Event locations.";
return view('pages.admin.locations.show', compact('page_title', 'page_description'))
->with('location' => $location);
}
欢迎任何指导或最佳实践建议。
您说“签到有很多用户”,您似乎希望单个用户签到,但目前这会导致很多用户。听起来用户签到是多对一的关系
另外 $checkin->created_at
默认是一个碳对象,所以你可以去 $checkin->created_at->format('jS F Y')
也不要混合使用 compact
和 with
,保持一致,只使用 1,因为它们可以达到相同的目的
另外 $checkin->users()->name
也不起作用,如果你在语法上使用括号只是 returns 一个查询生成器实例,你需要像 $checkin->users()->get()
一样调用它,或者您可以使用 $checkin->users
无论如何都会获取它们。如果您想更深入地研究,您可能需要研究在查询构建器实例上使用 with('relation')
来停止 N+1 查询。最后,$checkin->users()->get()->name
也不起作用,因为您的用户关系是多对多的,其中 returns 是一个集合,这再次指向您应该有一个名为 user
的 belongsTo 关系,但没有主元 [=30] =]