【问题标题】:Laravel relationships, Many to Many or Has Many Through?Laravel 关系,多对多还是多对多?
【发布时间】:2021-08-30 16:18:09
【问题描述】:

我正在使用 Laravel 8 构建一个 Web 应用程序,而我经常遇到的一件事是复杂的关系和访问数据。我已经开始阅读 hasManyThrough 关系,但我不相信这是我的场景的正确方法。

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

我有三个主要的表:

  • Locations(他们正在访问的地方),
  • Checkins(他们签入数据的存储位置,例如时间),
  • Users

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

  • 位置有很多用户,用户有很多位置。已创建多对多数据透视表。
  • 地点有很多签到,签到有很多地点。已创建多对多数据透视表。
  • 签到有很多用户,用户有很多签到。已创建多对多数据透视表。

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

现在我想做的是访问usercheck in,这样我就可以在我的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 关系是我实现这一目标的唯一方法吗?或者我应该让我的控制器更有创意,让用户通过他们自己的收藏来体验?

我当前的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);
 }

感谢任何方向或最佳实践建议。

【问题讨论】:

    标签: laravel eloquent laravel-8 eloquent-relationship


    【解决方案1】:

    您说“签到有很多用户”,您似乎希望单个用户签到,但目前这会导致很多用户。听起来用户签到是多对一的关系

    $checkin-&gt;created_at 默认也是碳对象,所以你可以直接去$checkin-&gt;created_at-&gt;format('jS F Y')

    也不要混合使用 compactwith,保持一致并只使用 1,因为它们实现相同的目标

    $checkin-&gt;users()-&gt;name 也不起作用,如果您使用括号语法仅返回一个查询构建器实例,您需要像 $checkin-&gt;users()-&gt;get() 一样调用 get on,或者您可以使用 $checkin-&gt;users 它将获取反正他们。如果您想更深入地研究,您可能需要考虑在查询构建器实例上使用 with('relation') 来停止 N+1 查询。最后$checkin-&gt;users()-&gt;get()-&gt;name 也不起作用,因为您的用户关系是多对多的,它返回一个集合,这再次表明您应该有一个名为 user 的没有数据透视表的 belongsTo 关系

    【讨论】:

    • 谢谢本,很好的回答。所以我上床睡觉,睡在上面以清醒头脑,今天早上回来,意识到我刚刚掉进了一个兔子洞,事情变得比我需要的更复杂。我已更改为签入、用户和位置之间的一对多关系,现在它正在发挥作用。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2018-01-22
    • 2016-02-26
    • 2016-01-04
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多