Laravel 关系,多对多或有许多通过?

Laravel relationships, Many to Many or Has Many Through?

我正在使用 Laravel 8 构建一个 Web 应用程序,我倾向于努力解决的一件事是复杂的关系和访问数据。我已经开始阅读 hasManyThrough 关系,但我不相信这是适合我的情况的正确方法。

旅行推销员使用该应用程序在他们安全到达时签到一个位置。

我有三个主要的table:

这是它变得有点复杂的地方,我发现自己无法只见树木不见森林...

因此它们都是使用 belongsToMany 关系创建的。

现在我想做的是访问 check inuser 这样我就可以调用类似于 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')

也不要混合使用 compactwith,保持一致,只使用 1,因为它们可以达到相同的目的

另外 $checkin->users()->name 也不起作用,如果你在语法上使用括号只是 returns 一个查询生成器实例,你需要像 $checkin->users()->get() 一样调用它,或者您可以使用 $checkin->users 无论如何都会获取它们。如果您想更深入地研究,您可能需要研究在查询构建器实例上使用 with('relation') 来停止 N+1 查询。最后,$checkin->users()->get()->name 也不起作用,因为您的用户关系是多对多的,其中 returns 是一个集合,这再次指向您应该有一个名为 user 的 belongsTo 关系,但没有主元 [=30] =]