Laravel 枢轴关系
Posted
技术标签:
【中文标题】Laravel 枢轴关系【英文标题】:Laravel Pivot relations 【发布时间】:2019-07-05 21:15:44 【问题描述】:我有Booking
、Status
和User
模型。我还有一个数据透视表 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 枢轴关系的主要内容,如果未能解决你的问题,请参考以下文章