Laravel 枢轴关系

Posted

技术标签:

【中文标题】Laravel 枢轴关系【英文标题】:Laravel Pivot relations 【发布时间】:2019-07-05 21:15:44 【问题描述】:

我有BookingStatusUser 模型。我还有一个数据透视表 booking_status 和额外的列 created_by 来跟踪谁更改了预订状态。

那么当我访问预订状态时如何获取用户信息:

$booking = App\Booking::first();

$statuses = $booking->history_statuses;

因此,当我在视图中遍历那些 statuses 时,我想检索用户的名称。是怎么做到的?

我知道我可以像这样访问该字段

$status->pivot->created_by

但后来我得到了用户的 ID,并且在每个状态的视图中按 id 获取用户感觉不正确。

【问题讨论】:

laravel.com/docs/5.7/eloquent-relationships 什么时候有问题? 你能分享你所有的模型吗? 【参考方案1】:

在你的关系中使用

public function booking_status()
    return $this->hasMany(booking_status::class)->withPivot('created_by');
  

然后你可以简单地使用

$booking = App\Booking::first();

$statuses = $booking->history_statuses;

foreach($statuses as $status)

   $status->pivot->created_by // this is your element


【讨论】:

我已经想到了,但是我只是得到了用户的 ID。如果我遍历视图中的状态以显示状态更改的历史记录,如果在视图中我每次都按 id 查找用户,我会发现它是错误的......我错过了什么吗?【参考方案2】:

假设从预订到状态存在多对多关系。现在您要创建从枢轴到用户的关系。 我昨天看了这个 2 小时。 我想出的解决方案是从预订到枢纽再到状态。 像这样的东西应该可以工作

预订模式

public function booking_status()
    return $this->hasMany(booking_status::class);
  

booking_status 模型

public function status()
    return $this->belongsTo(status::class);
 
public function user()
    return $this->belongsTo(status::class);

用户模型

public function booking_status()
    return $this->hasMany(booking_status::class);
 

【讨论】:

谢谢。我想到了类似的东西,但感觉必须有一种我不知道的更复杂和优雅的方式:) 在尝试创建与数据透视表的关系并访问该关系 2 或 3 小时后,我放弃并解决了这个怪物...... 好吧,至少现在我知道我不是唯一一个 :D 承诺分享的人,如果我遇到更好的解决方案 :) 但是.. 如果我们使用hasManyThrough 会怎样?那么我们也许可以做我上面做的事情,但更优雅,就像public function user()return $this->hasManyThrough('user','booking_status'); 我没有测试过,但看起来很有希望

以上是关于Laravel 枢轴关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 枢轴关系

Laravel 与枢轴的多态关系

Laravel Eloquent 嵌套关系枢轴与约束

Laravel 8:在空的多对多关系中使用枢轴时出错

Laravel中的多重关系(枢轴)

Laravel Eloquent Query 包含枢轴和关系